
ááąá¸ ááŹá!
ááąááşáá áşáááşáá˝áąáˇáá˝ááşá áá˝áśáˇááźááŻá¸áááŻá¸áááşáážáŻááŻááşáááşá¸á ááşááťáŹá¸áá˝ááş áá˝ááşááááşááŹááźáŻááŻááşááźááşá¸ááĄáááşá¸ááášá ááźáŽá¸áá˝áŹá¸ááŹááźááşá¸ááźáąáŹááˇáşá áá˝ááşááááşááŹáážááˇáşáááşá ááşááąáŹ áĄáááˇáşáĄááťááŻá¸ááťááŻá¸áážááˇáş áááşá ááşáá ášá ááşá¸ááťáŹá¸áááŻáśááźáŻáśááąá¸ááᯠááąááťáŹá áąááąá¸ááá ášá áááş áĄááąá¸áĄááźáŽá¸ááŻáśá¸ááźáżááŹáááŻááşááąá áááŻááşáááŻááşá á áşááąá¸áážáŻááťáŹá¸ááŻááşááąáŹááşááźááşá¸áááş áĄááťáááşááŻááşááąáŹááźáąáŹááˇáş á¤ááŻááşáááşá¸á ááşááᯠáĄáááŻáĄááťáąáŹááşááźá áşá áąáááşáĄáá˝ááş áĄáááşá¸ááŻáśá¸ áááŚá¸ááźáąáážááşá¸ááťáŹá¸ááᯠááŻááşááąáŹááşáááş áĄááźáśááŹááşááąáŹááşá¸áá áşááŻááźá áşáááşá
á¤ááąáŹááşá¸ááŤá¸áá˝ááşá á¤ááŻááşáááşá¸á
ááşáááŻá
ááşá¸áááşáááşáĄáá˝ááş Docker ááŻáśááźáŻáśááąá¸ utilities áĄááťáŹá¸áĄááźáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááşáĄáá˝ááş áĄáááşáááˇáşááŻááşááŹá¸ááąáŹ scripts ááťáŹá¸áážááˇáş á¤ááŻááşáááşá¸á
ááşáááŻá
ááşá¸áááşáááşáĄáá˝ááş demo stand áĄááąá¸áá
áşááŻááᯠáááşáááŻáˇáĄááŻáśá¸ááťááááşááᯠááťážááąááŤáááşá Dockerfile ááŻááşááŻáśááťáŹá¸áážááˇáş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸á ááŻáśááźáŻáśááąá¸ááᯠá
ááşá¸áááşáááˇáş ááŻááşáááşá¸á
ááşááᯠáááşáááŻáˇá
áŽá
ááşááááşááᯠá
ááşá¸áááşáááş áá
ášá
ááşá¸ááťáŹá¸áĄáŹá¸ áááşáĄááŻáśá¸ááźáŻáááŻááşááŤáááşá áá°áááŻááşá¸á áá˝áśáˇááźááŻá¸áááŻá¸áááşáážáŻáážááˇáş áĄááąáŹááşáĄáááşááąáŹáşáážáŻáááŻááşáᏠáĄááźáąááśáĄááąáŹááşáĄáĄáŻáśááťáŹá¸ ááá°ááŽááźáąáŹááşá¸ áážááşá¸áážááşá¸áááşá¸áááşá¸ ááááŹáááşáážáŹá¸áážáááşá áááŻáˇááźáąáŹááˇáş áĄáąáŹááşáá˝ááş ááźá
áşáááŻááşááźáąáážáááąáŹ áá˝áąá¸ááťááşá
ááŹááťáŹá¸á
á˝áŹááᯠááąáŹáşááźááąá¸ááŤáááşá
ááŻáśááźáŻáśááąá¸á á áşááąá¸áážáŻááťáŹá¸
Docker áĄááźáąááśáĄááąáŹááşáĄáĄáŻáśá áážáŻááąáŹááˇáşáĄááťááŻá¸ááťááŻá¸ááᯠá á áşááąá¸áážáŻááťáŹá¸ááźáŻááŻááşáááˇáş áá˝á˛ááźáŹá¸ááźáŹá¸ááŹá¸ááąáŹ áĄáá°áĄááŽááąá¸áááˇáşáĄááşááşááŽááąá¸áážááşá¸ááťáŹá¸áážááˇáş script áĄááťáŹá¸áĄááźáŹá¸áážááááşá áááşá¸áááŻáˇáá˛ááž áĄááťááŻáˇááᯠááááşááąáŹááşá¸ááŤá¸áá˝ááş ááąáŹáşááźáá˛áˇááźáŽá¸ááźá áşáááş () áážááˇáş á¤áĄááźáąáŹááşá¸áĄááŹáá˝ááş ááťá˝ááşáŻááşáááş áá˝áśáˇááźááŻá¸áááŻá¸áááşáážáŻááŻááşáááşá¸á ááşáĄáá˝ááşá¸ áááşááąáŹááşááŹá¸áááˇáş Docker ááŻáśááťáŹá¸áĄáá˝ááş ááŻáśááźáŻáśááąá¸áááŻáĄááşááťááşááťáŹá¸á áĄááťáŹá¸á áŻááᯠááŹáááááˇáş áááşá¸áááŻáˇáá˛ááž á ááŻááᯠáĄáŹááŻáśá ááŻááşáááŻááŤáááşá áááŻáˇáĄááźááşá ááŻáśááźáŻáśááąá¸á á áşááąá¸áážáŻááťáŹá¸ááŻááşááąáŹááşááẠᤠutilities ááŻáśá¸ááŻááᯠáááŻááşáááŻááşá¸áá áşááŻáá˛áááŻáˇ áááşáá˛áˇáááŻáˇááťáááşáááşáááŻááşááŻáśáááŻáááşá¸ ááá°ááŹááźááŤáááşá
Hadolint
ááááĄááŽá¸á ááşááŻáśá¸áĄááąááźááˇáş Dockerfile áááşá¸áá˝ážááşááťááşááťáŹá¸á áážááşáááşáážáŻáážááˇáş ááąá¸áááşá¸áážáŻááᯠáĄáá˛ááźááşáááş áá°ááŽááąá¸áááˇáş áááŻá¸áážááşá¸ááąáŹ áá˝ááşáááŻá¸ááş áĄááŻáśá¸áááşáážáŻáá áşáᯠ(áĽáááŹá áá˝ááˇáşááźáŻááťááşáááŹá¸ááąáŹ ááŻááşááŻáśá áŹáááşá¸áá˝ááşá¸ááźááşá¸ááťáŹá¸áááŻáᏠáĄááŻáśá¸ááźáŻááźááşá¸ áááŻáˇáááŻááş sudo áĄááŻáśá¸ááźáŻááźááşá¸)á

áĄáááŻááş
ááŻáśáá
áşááŻáś (áááŻáˇáááŻááş ááŻáśáá
áşááŻá ááááşá¸áááşá¸ááŹá¸ááąáŹ ááášáááŹá
áąá¸áážááşáááşá¸áážááˇáşáĄáá°) áĄááŻááşááŻááşááąáŹ áá˝ááşáááŻá¸ááşáĄááŻáśá¸áĄááąáŹááşáá
áşááŻááźá
áşáááˇáş ááŻáśáá
áşááŻáśá áážááşáááşáážáŻáážááˇáş ááŻáśááźáŻáśááąá¸ááᯠá
á
áşááąá¸ááąá¸áááˇáş áĄáá˝ážáŹááťáŹá¸áážááˇáş ááŻáśá
áśáá˝á˛áˇá
ááşá¸ááŻáśááᯠáááŻááşá¸ááźáŹá¸á
áááşááźáŹááźááşá¸- áĄááŻáśá¸ááźáŻáá°ááťáŹá¸ áááşááŽá¸ááŹá¸áááˇáş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻááŹá¸áááˇáşá áááŹáááťáŹá¸ááᯠáááşáááşááŹá¸áááşá áĄáá˝ááşá
ááŹá¸áážááşáá
áşáᯠáážáááąááźááşá¸ á
áááşááźááˇáş áá áááŻáĄááťáááşáĄáá á
á
áşááąá¸áážáŻáĄááąáĄáá˝ááşáááş áĄáá˝ááşáááźáŽá¸ááąá¸áᲠááťá˝ááşáŻááşáááŻáˇá áááŻááşáááŻááşá
á
áşááąá¸áážáŻááťáŹá¸áážááˇáş áĄááźáśááźáŻááťááşááťáŹá¸á
á˝áŹáĄááąáŤáş áĄááźáąááśááŹá¸áááşá Docker áĄáá˝ááşá

ááŹááşá
ááşá¸
áᎠutility á áĄáŹá¸áááşá¸ááťááşáážá áşááťááŻá¸ááᯠáážáŹáá˝áąáááŻáˇ áááşáá˝ááşááŤáááş - OS áááşááąáŹááşáážáŻááźáżááŹáá˝áą (Alpineá RedHat (EL) áá˝áąááᯠsupport ááŻááşááŤáááş)á CentOS, Debian ááťáŽáĄááşáá°á Ubuntu) áážááˇáş áážáŽáááŻáážáŻááźáżááŹááťáŹá¸ (Gemfile.locká Pipfile.locká composer.locká package-lock.jsoná yarn.locká Cargo.lock)á Trivy áááş repository image áážááˇáş local image áážá áşááťááŻá¸ááŻáśá¸ááᯠscan ááŻááşáááŻááşáááᯠDocker image ááŤáááşáááˇáş ááąá¸ááŹá¸ááąáŹ .tar áááŻááşááᯠáĄááźáąááśá scan ááŻááşáááŻááşáááşá

áĄááŻáśá¸áĄááąáŹááşááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááş áá˝áąá¸ááťááşáážáŻááťáŹá¸
ááŽá¸ááźáŹá¸áááşáááşá¸ááťááşáá˝ááş ááąáŹáşááźááŹá¸ááąáŹ áĄáááŽááąá¸áážááşá¸ááťáŹá¸ááᯠá ááşá¸ááŻáśá¸ááźááˇáşáááşáĄáá˝ááş áĄáááşá¸áááşáááŻá¸áážááşá¸ááąáŹ ááŻááşáááşá¸á ááşáá˝ááş utilities áĄáŹá¸ááŻáśá¸ááᯠáááˇáşáá˝ááşá¸ááźááşá¸áĄáá˝ááş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸ááᯠááťá˝ááşáŻááşááąá¸ááŤáááşá
áĄááá áĄááŻááşááŽááŹáážáŹ áá˝áśáˇááźááŻá¸áááŻá¸áááşáážáŻáĄáá˝ááşá¸ áááşááŽá¸ááŹá¸áááˇáş Dockerfiles áážááˇáş Docker ááŻáśááťáŹá¸á áĄáááŻáĄááťáąáŹááş áĄááźáąáŹááşá¸áĄáᏠáĄáááşááźáŻááźááşá¸áĄáŹá¸ áááşáááşáá˛áˇáááŻáˇ áĄááąáŹááşáĄáááş ááąáŹáşáááŻááşáááşááᯠáááŻááşááźáááş ááźá áşáááşá
á á áşááąá¸ááťááşáá˝ááş áĄáąáŹááşááŤáĄáááˇáşááťáŹá¸ ááŤáááşááŤáááşá
- linter utility ááᯠáĄááŻáśá¸ááźáŻá Dockerfile áá˝ážááşááźáŹá¸ááťááşááťáŹá¸á áážááşáááşáážáŻáážááˇáş ááąá¸áááşá¸áážáŻááᯠá á áşááąá¸ááźááşá¸á Hadolint
- utility ááᯠáĄááŻáśá¸ááźáŻá ááąáŹááşááŻáśá¸áážááˇáş áĄáááşáĄáááşááŻáśááťáŹá¸á áážááşáááşáážáŻáážááˇáş ááąá¸áááşá¸áážáŻááᯠá á áşááąá¸ááźááşá¸á áĄáááŻááş
- áĄááźáąááśááŻáśáá˝ááş áá°áááážááşááźáŹá¸áááááŻááşááąáŹ áĄáŹá¸áááşá¸ááťááşááťáŹá¸ (CVE) áážááˇáş áážáŽáááŻáážáŻááťáŹá¸á á˝áŹááᯠá á áşááąá¸ááźááşá¸ - utility ááᯠáĄááŻáśá¸ááźáŻá ááŹááşá ááşá¸
ááąáŹááşáááŻááşá¸áá˝ááş á¤áĄáááˇáşááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááşáĄáá˝ááş áá˝áąá¸ááťááşá
ááŹááŻáśá¸ááŻááᯠááąáŹááşá¸ááŤá¸áá˝ááş ááąáŹáşááźááąá¸ááŤáááşá
ááááĄááťááşáážáŹ GitLab ááᯠáĄááŻáśá¸ááźáŻá CI/CD áááŻááşáááŻááşá¸ááᯠá
áśááá°ááŹáĄááźá
áş áááşáážááşááźááşá¸ (á
ááşá¸áááşáážáŻáá
áşáᯠááźáŻááŻááşááźááşá¸ ááŻááşáááşá¸á
ááşá ááąáŹáşááźááťááşáážááˇáşáĄáá°)á
ááŻááááá
áşááŻáááąáŹáˇ shell script áááŻááŻáśá¸ááŤáááşá
áááááá
áşááŻáážáŹ Docker ááŻáśááťáŹá¸áááŻá
áááşááşáááşáááş Docker ááŻáśáá
áşááŻáááşááąáŹááşááźááşá¸ááŤáááşáááşá
áááˇáşáĄáá˝ááş áĄáááˇáşááąáŹáşááŻáśá¸ áá˝áąá¸ááťááşáážáŻááᯠáááşáá˝áąá¸ááťááşáááŻááşááźáŽá¸ áááşá¸ááᯠáááşááĄááźáąááśáĄááąáŹááşáĄáĄáŻáśáááŻáˇ áá˝ážá˛ááźáąáŹááşá¸ááźáŽá¸ áááˇáşáááŻáĄááşááťááşááťáŹá¸áážááˇáş áááŻááşááťáąáŹááŽáá˝áąááźá
áşáĄáąáŹááş ááźáŻááŻááşáááŻááşáááşá
áááŻáĄááşááąáŹ áááŻááşááťáŹá¸áážááˇáş áááşááąáŹááşá¸áá˝ážááşááźáŹá¸ááťááşááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠáááŻáážáąáŹááşááŻáśáá˝ááş áááşáážááááş-
GitLab CI/CD áá˝ááş ááąáŤááşá¸á ááşááźááşá¸á
ááááá˝áąá¸ááťááşáážáŻáá˝ááşá áĽáááŹáá áşááŻáĄááąááźááˇáş GitLab repository system áááŻáĄááŻáśá¸ááźáŻá ááŻáśááźáŻáśááąá¸á á áşááąá¸áážáŻááťáŹá¸ááᯠáááşáááşáá˛áˇáááŻáˇáĄááąáŹááşáĄáááşááąáŹáşáááŻááşáááşááᯠááźááˇáşáážáŻááŤáááşá á¤áá˝ááş ááťá˝ááşáŻááşáááŻáˇáááş áĄáááˇáşááťáŹá¸áááŻááźááşáááşá¸ááźáŽá¸ GitLab ááźááˇáş á ááşá¸áááşáážáŻáááşáááşá¸ááťááşááᯠáĄá áážáĄááŻáśá¸ áááşáááŻáˇáááˇáşáá˝ááşá¸ááááşááᯠáá˝ááşáááźáŽá¸á á áááşááşáááşááźááşá¸ááŻááşáááşá¸á ááşáááŻáááşááŽá¸áᏠá ááşá¸áááşáážáŻ Dockerfile áážááˇáş ááťáááşá¸ááŻáś- JuiceShop áĄáááŽááąá¸áážááşá¸áááŻá á áşááąá¸áááşáĄáá˝ááş á áááşááŻááşááąáŹááşááááˇáş áĄááŻáśá¸áááşáážáŻááťáŹá¸á
GitLab ááᯠáááˇáşáá˝ááşá¸ááźááşá¸á
1. Docker ááᯠáááˇáşáá˝ááşá¸ááŤ-
sudo apt-get update && sudo apt-get install docker.io2. sudo áááŻáĄááŻáśá¸áááźáŻáᲠdocker áážááˇáşáĄááŻááşááŻááşáááŻááşá áąáááş áááşáážááĄááŻáśá¸ááźáŻáá°ááᯠdocker áĄáŻááşá áŻáááŻáˇáááˇáşááŤ-
sudo addgroup <username> docker3. áááşá IP ááᯠââáážáŹááŤ-
ip addr4. GitLab ááᯠáá˝ááşááááşááŹáá˝ááş áááˇáşáá˝ááşá¸ááźáŽá¸ á áááşáĄááŻáśá¸ááźáŻáᏠhostname áážá IP ááááşá áŹááᯠáááˇáşáááŻááşáááŻááşááźááˇáş áĄá áŹá¸áááŻá¸ááŤ-
docker run --detach
--hostname 192.168.1.112
--publish 443:443 --publish 80:80
--name gitlab
--restart always
--volume /srv/gitlab/config:/etc/gitlab
--volume /srv/gitlab/logs:/var/log/gitlab
--volume /srv/gitlab/data:/var/opt/gitlab
gitlab/gitlab-ce:latestGitLab áááş áááŻáĄááşááąáŹ áááşáááşáážáŻááŻááşáááşá¸á ááşááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠááźáŽá¸ááźáąáŹááşáááşáĄáá ááťá˝ááşáŻááşáááŻáˇ á áąáŹááˇáşááťážáąáŹáşááąááŤáááş (áážááşáááşá¸áááŻááşáĄáá˝ááşáážáá áşáááˇáş ááŻááşáááşá¸á ááşááᯠá áąáŹááˇáşááźááˇáşáááŻááşáááş- docker logs -f gitlab)á
5. áááşáááąáááś IP ááᯠââáááąáŹááşááŹáá˝ááşáá˝ááˇáşááźáŽá¸ áĄááźá
áşáĄááŻáśá¸ááźáŻáá°áĄáá˝ááş á
ááŹá¸áážááşááᯠááźáąáŹááşá¸áá˛áááş ááąáŹááşá¸áááŻááąáŹ á
áŹááťááşáážáŹáááŻááźááˇáşááŤ-

á
ááŹá¸áážááşáĄáá
áşáá
áşááŻáááşáážááşááźáŽá¸ GitLab áááŻáˇáá˝áŹá¸ááŤá
6. áááąáŹááťááşáĄáá
áşáá
áşáᯠáááşááŽá¸ááŤá áĽááᏠcicd-test áážááˇáş start file ááźááˇáş áĄá
ááźáŻááŤá README.md:

7. ááᯠááťá˝ááşáŻááşáááŻáˇáááş GitLab Runner ááᯠáááşáááşáááş áááŻáĄááşáááş- ááąáŹááşá¸áááŻáážáŻáĄá áááŻáĄááşááąáŹ ááŻááşááąáŹááşáážáŻááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠááŻááşááąáŹááşááąá¸áááˇáş áĄáąá¸ááťááˇáşáá
áşááŻááźá
áşáááşá
ááąáŹááşááŻáśá¸áá˝ááşááŹá¸áážááşá¸ááᯠááąáŤááşá¸ááŻááşááŻááşá፠(á¤ááá
ášá
áá˝ááşá áĄáąáŹááşáá˝ááş Linux áá-áá
áş):
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd648. áááşá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááŻááşá áąáááş-
sudo chmod +x /usr/local/bin/gitlab-runner9. Runner áĄáá˝ááş OS áĄááŻáśá¸ááźáŻáá°áá áşáŚá¸ááᯠááąáŤááşá¸áááˇáşáᏠáááşááąáŹááşáážáŻááᯠá áááşááŤ-
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner startáááşá¸áááşá¤áá˛áˇáááŻáˇááąáŹááŻáśááášááŹááşáážááááˇáşáááş-
local@osboxes:~$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
Runtime platform arch=amd64 os=linux pid=8438 revision=0e5417a3 version=12.0.1
local@osboxes:~$ sudo gitlab-runner start
Runtime platform arch=amd64 os=linux pid=8518 revision=0e5417a3 version=12.0.1 10. ááᯠááťá˝ááşáŻááşáááŻáˇáááş ááťá˝ááşáŻááşáááŻáˇá GitLab á
áśááá°ááŹáážááˇáş áĄááźááşáĄáážááşáĄááťááŻá¸áááşááąáŹááşáááŻááşá
áąáááş Runner ááᯠáážááşááŻáśáááşáááŻááşááŤá
ááŤáááŻááŻááşáááŻáˇá Settings-CI/CD á
áŹááťááşáážáŹ (http://OUR_IP_ADDRESS/root/cicd-test/-/settings/ci_cd) áááŻáá˝ááˇáşááźáŽá¸ Runners tab ááąáŤáşáážáŹ URL áá˛áˇ Registration token áááŻáážáŹááŤá

11. URL áážááˇáş áážááşááŻáśáááşááźááşá¸áááŻáááşááᯠáĄá
áŹá¸áááŻá¸ááźááşá¸ááźááˇáş Runner ááᯠáážááşááŻáśáááşááŤ-
sudo gitlab-runner register
--non-interactive
--url "http://<URL>/"
--registration-token "<Registration Token>"
--executor "docker"
--docker-privileged
--docker-image alpine:latest
--description "docker-runner"
--tag-list "docker,privileged"
--run-untagged="true"
--locked="false"
--access-level="not_protected"ááááşáĄááąááźááˇáşá ááťá˝ááşáŻááşáááŻáˇáááş ááťá˝ááşáŻááşáááŻáˇá utilities áááŻá áááşáááş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸áááˇáşáááş áááŻáĄááşáááˇáş áĄáááşáááˇáşááŻááşááŹá¸ááąáŹ GitLab áááŻááážáááŹá¸ááŤáááşá á¤áááŻááşááźáá˝ááş ááťá˝ááşáŻááşáááŻáˇáá˝ááş áĄáááŽááąá¸áážááşá¸áááŻáááşááąáŹááşááźáŽá¸ ááááşá¸áááşá¸áááş áĄáááˇáşááťáŹá¸ááážáááąáŹáşáááşá¸ ááááˇáşáááşáááşá¸ááťááşáá˝ááş áááşá¸áááŻáˇáááş á áááşáááşá á áşááąá¸ááźááşá¸áĄáááˇáşááťáŹá¸áááş ááťáąáŹáşáá˝ááşáá˝áŹá¸áᏠáá˝á˛ááźááşá¸á áááşááźáŹáááşáĄáá˝ááş ááŻáśááťáŹá¸áážááˇáş Dockerfile áá áşááŻááᯠááŻááşááąá¸áááşááźá áşáááşá
áááŻááşáááŻááşá¸áá˝á˛áˇá ááşá¸áážáŻ
1. áááŻáážáąáŹááşáážáŻáááŻáˇ áááŻááşááťáŹá¸áááˇáşááŤá mydockerfile.df (ááŤá á ááşá¸áááşá á áşááąá¸áááˇáş Dockerfile) áá˛áˇ GitLab CI/CD ááŻááşáááşá¸á ááşáá˝á˛áˇá ááşá¸ááŻáśáááŻááş .gitlab-cicd.ymlá áááşááŹááťáŹá¸áĄáá˝ááş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸ááᯠá áŹáááşá¸ááźáŻá áŻáááş (áááŻááşáĄáááşáá˝ááş áĄá ááşááᯠáážááşááŹá¸ááŤ)á
YAML áá˝á˛áˇá ááşá¸áážáŻááŻáśá áśáááŻááşáá˝ááş áá˝áąá¸ááťááşááŹá¸ááąáŹ Dockerfile áážááˇáş DOCKERFILE áá˝á˛áá˝á˛ááťááşáá˝ááşááąáŹáşááźááŹá¸ááąáŹááŻáśáááŻáˇááᯠáááŻááşá¸ááźáŹá¸á áááşááźáŹááąá¸áááˇáş utilities ááŻáśá¸áᯠ(Hadolintá Dockle áážááˇáş Trivy) ááᯠrun áááş áááşá¸áá˝ážááşááťááşááťáŹá¸ááŤáážááááşá áááŻáĄááşááąáŹáááŻááşáĄáŹá¸ááŻáśá¸ááᯠrepository áážáá°áááŻááşáááş-
ááž áá°á¸áá°ááąáŹáşááźááŤáááşá mydockerfile.df (á¤áááş utility ááááşáááşáážáŻáááŻááźááááşááŹáááşááááŻáá˝ážááşááźáŹá¸ááťááşááťáŹá¸ááŤáážáááąáŹ abstract áááŻááşáá áşááŻááźá áşáááşá) áááŻááşáááŻáˇ áááŻááşáááŻááşáááˇáşááş-
mydockerfile.df á áĄááźáąáŹááşá¸áĄááŹááťáŹá¸
FROM amd64/node:10.16.0-alpine@sha256:f59303fb3248e5d992586c76cc83e1d3700f641cbcd7c0067bc7ad5bb2e5b489 AS tsbuild
COPY package.json .
COPY yarn.lock .
RUN yarn install
COPY lib lib
COPY tsconfig.json tsconfig.json
COPY tsconfig.app.json tsconfig.app.json
RUN yarn build
FROM amd64/ubuntu:18.04@sha256:eb70667a801686f914408558660da753cde27192cd036148e58258819b927395
LABEL maintainer="Rhys Arkins <rhys@arkins.net>"
LABEL name="renovate"
...
COPY php.ini /usr/local/etc/php/php.ini
RUN cp -a /tmp/piik/* /var/www/html/
RUN rm -rf /tmp/piwik
RUN chown -R www-data /var/www/html
ADD piwik-cli-setup /piwik-cli-setup
ADD reset.php /var/www/html/
## ENTRYPOINT ##
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
USER rootáá˝á˛áˇá ááşá¸áážáŻ YAML áááş á¤áá˛áˇáááŻáˇ ááźá áşáááş (áááŻááşáááŻááşáááŻááşá á¤ááąááŹáá˝ááş áááŻááşáááŻááşáááˇáşááşáážáá áşáááˇáş áá˝áąáˇáááŻááşáááş- ):
.gitlab-ci.yml á áĄááźáąáŹááşá¸áĄááŹááťáŹá¸
variables:
DOCKER_HOST: "tcp://docker:2375/"
DOCKERFILE: "mydockerfile.df" # name of the Dockerfile to analyse
DOCKERIMAGE: "bkimminich/juice-shop" # name of the Docker image to analyse
# DOCKERIMAGE: "knqyf263/cve-2018-11235" # test Docker image with several CRITICAL CVE
SHOWSTOPPER_PRIORITY: "CRITICAL" # what level of criticality will fail Trivy job
TRIVYCACHE: "$CI_PROJECT_DIR/.cache" # where to cache Trivy database of vulnerabilities for faster reuse
ARTIFACT_FOLDER: "$CI_PROJECT_DIR"
services:
- docker:dind # to be able to build docker images inside the Runner
stages:
- scan
- report
- publish
HadoLint:
# Basic lint analysis of Dockerfile instructions
stage: scan
image: docker:git
after_script:
- cat $ARTIFACT_FOLDER/hadolint_results.json
script:
- export VERSION=$(wget -q -O - https://api.github.com/repos/hadolint/hadolint/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
- wget https://github.com/hadolint/hadolint/releases/download/v${VERSION}/hadolint-Linux-x86_64 && chmod +x hadolint-Linux-x86_64
# NB: hadolint will always exit with 0 exit code
- ./hadolint-Linux-x86_64 -f json $DOCKERFILE > $ARTIFACT_FOLDER/hadolint_results.json || exit 0
artifacts:
when: always # return artifacts even after job failure
paths:
- $ARTIFACT_FOLDER/hadolint_results.json
Dockle:
# Analysing best practices about docker image (users permissions, instructions followed when image was built, etc.)
stage: scan
image: docker:git
after_script:
- cat $ARTIFACT_FOLDER/dockle_results.json
script:
- export VERSION=$(wget -q -O - https://api.github.com/repos/goodwithtech/dockle/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
- wget https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz && tar zxf dockle_${VERSION}_Linux-64bit.tar.gz
- ./dockle --exit-code 1 -f json --output $ARTIFACT_FOLDER/dockle_results.json $DOCKERIMAGE
artifacts:
when: always # return artifacts even after job failure
paths:
- $ARTIFACT_FOLDER/dockle_results.json
Trivy:
# Analysing docker image and package dependencies against several CVE bases
stage: scan
image: docker:git
script:
# getting the latest Trivy
- apk add rpm
- export VERSION=$(wget -q -O - https://api.github.com/repos/knqyf263/trivy/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/1/')
- wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz && tar zxf trivy_${VERSION}_Linux-64bit.tar.gz
# displaying all vulnerabilities w/o failing the build
- ./trivy -d --cache-dir $TRIVYCACHE -f json -o $ARTIFACT_FOLDER/trivy_results.json --exit-code 0 $DOCKERIMAGE
# write vulnerabilities info to stdout in human readable format (reading pure json is not fun, eh?). You can remove this if you don't need this.
- ./trivy -d --cache-dir $TRIVYCACHE --exit-code 0 $DOCKERIMAGE
# failing the build if the SHOWSTOPPER priority is found
- ./trivy -d --cache-dir $TRIVYCACHE --exit-code 1 --severity $SHOWSTOPPER_PRIORITY --quiet $DOCKERIMAGE
artifacts:
when: always # return artifacts even after job failure
paths:
- $ARTIFACT_FOLDER/trivy_results.json
cache:
paths:
- .cache
Report:
# combining tools outputs into one HTML
stage: report
when: always
image: python:3.5
script:
- mkdir json
- cp $ARTIFACT_FOLDER/*.json ./json/
- pip install json2html
- wget https://raw.githubusercontent.com/shad0wrunner/docker_cicd/master/convert_json_results.py
- python ./convert_json_results.py
artifacts:
paths:
- results.htmláááŻáĄááşááŤá áááşáááş .tar archive ááŻáśá áśááźááˇáş ááááşá¸áááşá¸ááŹá¸ááąáŹ ááŻáśááťáŹá¸ááᯠá áááşááşáááşáááŻááşáááş (áááŻáˇááąáŹáş YAML áááŻááşáážá utilities áĄáá˝ááş input parameters ááťáŹá¸ááᯠááźáąáŹááşá¸áá˛áááş áááŻáĄááşááŤáááş)
NB- ááŹááşá ááşá¸á፠áááˇáşáá˝ááşá¸áááş áááŻáĄááşáááşá rpm á፠и git. áááŻááşááŤáá RedHat-based ááŻáśááťáŹá¸áááŻá áááşááşáááşááźáŽá¸ áĄáŹá¸áááşá¸ááťááşááąááŹááąáˇá áşáááŻáˇ áĄááşááááşááťáŹá¸áááşááśááąáŹáĄááŤáá˝ááş áĄáážáŹá¸áĄáá˝ááşá¸ááťáŹá¸ááźá áşááąáŤáşááŹááááˇáşáááşá
2. repository áá˝ááş áááŻááşááťáŹá¸ááᯠááąáŤááşá¸áááˇáşááźáŽá¸ááąáŹááşá ááťá˝ááşáŻááşáááŻáˇá configuration file áážá áááşá¸áá˝ážááşááťááşááťáŹá¸áĄáá GitLab áááş áááşááąáŹááşááźááşá¸áážááˇáş á áááşáááşááźááşá¸ ááŻááşáááşá¸á ááşááᯠáĄáááŻáĄááťáąáŹááş á áááşáááşááźá áşááŤáááşá CI/CD â áááŻááşáááŻááşá¸ááťáŹá¸ áááşááşáá˝ááş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸á áááŻá¸áááşáážáŻááᯠáááşáá˝áąáˇááźááşáááŻááşááŤáááşá
áááŻáˇááźáąáŹááˇáş ááťá˝ááşáŻááşáááŻáˇáá˝ááş áĄááŻááşááąá¸ááŻáážááááşá áááşá¸áááŻáˇáá˛ááž ááŻáśá¸áŚá¸áááş á
áááşáááşááźááşá¸áá˝ááş áááŻááşáááŻááşááŻááşááąáŹááşááźááźáŽá¸ ááąáŹááşááŻáśá¸áá
áşáᯠ(áĄá
áŽáááşááśá
áŹ) áááş ááźááˇáşááťá˛ááąááąáŹ áááŻááşááťáŹá¸ááž áááŻá¸áážááşá¸ááąáŹ áĄá
áŽáááşááśá
áŹááᯠá
áááşáááşááźááşá¸ááááşááťáŹá¸ááźááˇáş á
áŻááąáŹááşá¸ááŤáááşá

ááŻáśááášááŹááş áááŻáˇáááŻááş áážáŽáááŻáážáŻáá˝ááş áĄááąá¸ááźáŽá¸ááąáŹ áĄáŹá¸áááşá¸ááťááşááťáŹá¸ááᯠáá˝áąáˇáážáááŤá Trivy áááş áááşáááşáážáŻááᯠáááşáá˝áŹá¸ááŤáááşá áá
áşááťáááşáááşá¸áážáŹáááşá Hadolint áááş áááşááąáŹááşáážáŻááᯠáááşáááˇáşáá˝áŹá¸á
áąáááˇáş áážááşááťááşááťáŹá¸áá˝ááş áĄááźá˛ááááşáá˝ááşááąáŤáşááąááąáŹááźáąáŹááˇáş áĄáąáŹááşááźááşáážáŻááŻááşááᯠáĄááźá˛ááźááşááąá¸ááŤáááşá
áááşá ááŽá¸ááźáŹá¸áááŻáĄááşááťááşááťáŹá¸áĄááąáŤáşáá°áááşá ᤠutilities ááťáŹá¸áááş áĄááťááŻáˇááąáŹ ááąáááşáááŻááşá¸ááźáŹá¸áážáŻáááŻááşáᏠááźáżááŹááťáŹá¸ááᯠáá˝áąáˇáážáááąáŹáĄááŤá áááşááąáŹááşáážáŻááŻááşáááşá¸á
ááşáááŻáááşá¸ áááşáááˇáşá
áąáááşáĄáá˝ááş áá˝ááşááąáŤááşááŻááşáá
áşááŻááᯠáááş configure ááŻááşáááŻááşááŤáááşá ááťá˝ááşáŻááşáááŻáˇááĄááźáąáĄááąáá˝ááşá Trivy áá˝ááş ááťá˝ááşáŻááşáááŻáˇáááşáážááşááŹá¸ááąáŹ SHOWSTOPPER ááááşá¸áážááşáá˝ááş áááşáážááşááŹá¸ááąáŹ ááąáááşáááŻááşá¸ááźáŹá¸áážáŻáážááˇáşáĄáá° áĄáŹá¸áááşá¸ááťááşáá
áşááŻááᯠáá˝áąáˇáážááážáᏠáááşááąáŹááşáážáŻáááşáááˇáşáá˝áŹá¸áááşááźá
áşáááşá .gitlab-ci.yml.

áĄááŻáśá¸áááşáážáŻáá
áşááŻá
áŽáááááşááᯠá
áááşáááşááźááşá¸ááŻááşáááşá¸áá
áşááŻá
áŽá áážááşáááşá¸áá˝ááşá artifacts ááášááážá json áááŻááşááťáŹá¸áá˝ááş áááŻááşáááŻááşááźááˇáşáážáŻáááŻááşáááş áááŻáˇáááŻááş áááŻá¸áážááşá¸ááąáŹ HTML áĄá
áŽáááşááśá
áŹáá
áşáᯠ(áĄáąáŹááşááŤáĄááťááşáĄááąáŤáş áááŻáááŻáááážááááŻááşáááş)á

3. áĄááŻáśá¸áááşááŻáśáĄá
áŽáááşááśá
áŹááťáŹá¸ááᯠáĄáááşá¸áááşáááŻáááŻáá°ááŹá¸áááşáááŻááşááąáŹááŻáśá
áśááźááˇáşáááşááźáááşá ááťááŻáˇáá˝ááşá¸ááťááşáááŹá¸áá
áşááŻááŤáážáááąáŹ JSON áááŻááşááŻáśá¸ááŻááᯠHTML áááŻááşáá
áşááŻáĄááźá
áşáááŻáˇ ááźáąáŹááşá¸áááşáĄáá˝ááş Python script áĄááąá¸ááᯠáĄááŻáśá¸ááźáŻáááşá
á¤á
ááá
áşááᯠááŽá¸ááźáŹá¸áĄá
áŽáááşááśááźááşá¸ááŻááşáááşá¸á á
áááşááŻááşááąáŹááşááźáŽá¸ áááşá¸áááąáŹááşááŻáśá¸áááşááŽá¸áážáŻáážáŹ áĄá
áŽáááşááśá
áŹá፠HTML áááŻááşáá
áşááŻááźá
áşáááşá script source áááş repository áá˝ááşáááşá¸áážáááźáŽá¸ áááˇáşáááŻáĄááşááťááşááťáŹá¸á áĄááąáŹááşááťáŹá¸ á
áááşáááŻáˇááᯠáááŻááşááťáąáŹááŽáá˝áąááźá
áşá
áąáááŻááşáááşá

Shell áá˛ááťá
CI/CD á áá áşáĄááźááşáááş Docker ááŻáśááťáŹá¸ááᯠá á áşááąá¸áááş áááŻáĄááşááąáŹáĄááŤáá˝ááşá áááŻáˇáááŻááş host áá˝ááş áááŻááşáááŻááşááŻááşááąáŹááşáááŻááşááąáŹ ááąáŹááşáá˝ááş áá˝ážááşááźáŹá¸ááťááşááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠáááŻáĄááşáááˇáşáĄááŤáá˝ááş ááŻááááá˝áąá¸ááťááşáá˝ááˇáşáááş áááˇáşááťáąáŹáşáááşá á¤áá˝áąá¸ááťááşáážáŻááᯠáááˇáşáážááşá¸ááąáŹ virtual (áááŻáˇáááŻááş áĄá á áşáĄáážááşáááş) á ááşááąáŤáşáá˝ááş ááŻááşááąáŹááşáááŻááşáááˇáş áĄáááşáááˇáşááŻááşááŹá¸ááąáŹ shell script ááźááˇáş áĄááťáŻáśá¸áááşááŤáááşá script áááş áĄáááşáá˝ááşááąáŹáşááźááŹá¸ááąáŹ gitlab-runner áá˛áˇáááŻáˇáá°ááŽááąáŹáá˝ážááşááźáŹá¸ááťááşááťáŹá¸áááŻááŻááşááąáŹááşáááşá
script áááŻáĄáąáŹááşááźááşá á˝áŹáááşáááşáááşáĄáá˝ááş Docker áááŻá áá áşáá˝ááşáááˇáşáá˝ááşá¸ááááşááźá áşááźáŽá¸ áááşáážááĄááŻáśá¸ááźáŻáá°áááş docker áĄáŻááşá áŻáá˝ááşáážáááááşááźá áşáááşá
ááŹááşáá˝ážááşá¸ááᯠá¤ááąááŹáá˝ááş áá˝áąáˇáááŻááşáááş-
áááŻááşááĄá áá˝ááşá ááááşá¸áážááşááťáŹá¸áááş áááşáááˇáşááŻáśáááŻá áááşááşáááşáááş áááŻáĄááşáááşááᯠáááşáážááşááąá¸ááźáŽá¸ áááşáááˇáşááąáááşááťááşááťááŻáˇáá˝ááşá¸ááťááşááťáŹá¸áááş áááşáážááşááŹá¸ááąáŹ áĄáážáŹá¸áĄáá˝ááşá¸ááŻááşááźááˇáş áá˝ááşááąáŤááşááźá áşá áąáááˇáş Trivy utility ááᯠáááşáážááşááąá¸ááŤáááşá
ááŹááşáá˝ážááşá¸ááᯠááŻááşááąáŹááşááąá ááşáĄáá˝ááşá¸ áĄááŻáśá¸áááşáážáŻáĄáŹá¸ááŻáśá¸ááᯠáááşá¸áá˝ážááşáááŻáˇ ááąáŤááşá¸ááŻááşááŻááşááŤáááşá docker_toolsáá°áááŻáˇáá˛áˇ áĄááŻááşááááşáá˝áąá áááşá¸áá˝ážááşáá˛áážáŹ áážáááąáááşá docker_tools/jsoná áážááˇáş áĄá áŽáááşááśá áŹááŤáážáááąáŹ HTML áááş áááŻááşáá˛áá˝ááş áážáááááˇáşáááşá results.html.
áĽááᏠscript output
~/docker_cicd$ ./docker_sec_check.sh
[+] Setting environment variables
[+] Installing required packages
[+] Preparing necessary directories
[+] Fetching sample Dockerfile
2020-10-20 10:40:00 (45.3 MB/s) - âDockerfileâ saved [8071/8071]
[+] Pulling image to scan
latest: Pulling from bkimminich/juice-shop
[+] Running Hadolint
...
Dockerfile:205 DL3015 Avoid additional packages by specifying `--no-install-recommends`
Dockerfile:248 DL3002 Last USER should not be root
...
[+] Running Dockle
...
WARN - DKL-DI-0006: Avoid latest tag
* Avoid 'latest' tag
INFO - CIS-DI-0005: Enable Content trust for Docker
* export DOCKER_CONTENT_TRUST=1 before docker pull/build
...
[+] Running Trivy
juice-shop/frontend/package-lock.json
=====================================
Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 2, CRITICAL: 0)
+---------------------+------------------+----------+---------+-------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | VERSION | TITLE |
+---------------------+------------------+----------+---------+-------------------------+
| object-path | CVE-2020-15256 | HIGH | 0.11.4 | Prototype pollution in |
| | | | | object-path |
+---------------------+------------------+ +---------+-------------------------+
| tree-kill | CVE-2019-15599 | | 1.2.2 | Code Injection |
+---------------------+------------------+----------+---------+-------------------------+
| webpack-subresource | CVE-2020-15262 | LOW | 1.4.1 | Unprotected dynamically |
| | | | | loaded chunks |
+---------------------+------------------+----------+---------+-------------------------+
juice-shop/package-lock.json
============================
Total: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)
...
juice-shop/package-lock.json
============================
Total: 5 (CRITICAL: 5)
...
[+] Removing left-overs
[+] Making the output look pretty
[+] Converting JSON results
[+] Writing results HTML
[+] Clean exit ============================================================
[+] Everything is done. Find the resulting HTML report in results.htmláĄááŻáśá¸áááşáážáŻáĄáŹá¸ááŻáśá¸áážááˇáşáĄáá° Docker ááŻáś
áááááááşá¸áá áşááŻáĄááąááźááˇáşá ááŻáśááźáŻáśááąá¸áĄááŻáśá¸áĄááąáŹááşááťáŹá¸ááźááˇáş ááŻáśáá áşááŻáśáááşááŽá¸áááş áááŻá¸áážááşá¸ááąáŹ Dockerfiles áážá áşááŻááᯠááźáŻá áŻáá˛áˇáááşá Dockerfile áá áşááŻáááş repository áá áşááŻáážááŻáśáá áşááŻáśáááŻá áááşááşáááşáááşáĄáá˝ááş set áááŻáááşááąáŹááşáááşáá°ááŽááááˇáşáááşá ááŻááá (Dockerfile_tar) áááş image áá áşááŻáážááˇáş tar áááŻááşáááŻá áááşááşáááşáááşáĄáá˝ááş set áá áşááŻáááŻáááşááąáŹááşááŹáá˝ááşáá°ááŽááááˇáşáááşá
1. áááşáááŻááşáᏠDocker áááŻááşáážááˇáş script ááťáŹá¸ááᯠrepository ááž áá°ááŤá .
2. ááťá˝ááşáŻááşáááŻáˇáááş áááşá¸ááᯠá
ááşá¸ááąá¸áá˝á˛áĄáá˝ááş á
áááşáááŻááşáááş-
docker build -t dscan:image -f docker_security.df .
3. á ááşá¸ááąá¸áá˝á˛ááźáŽá¸ááąáŹáĄááŤá ááťá˝ááşáŻááşáááŻáˇáááş ááŻáśáá˛ááž container áá áşááŻááᯠáááşááŽá¸ááŤá áá áşááťáááşáááşá¸áážáŹáááşá ááťá˝ááşáŻááşáááŻáˇáááş ááťá˝ááşáŻááşáááŻáˇá áááşáááşá áŹá¸ááąáŹ ááŻáśááĄáááşááźááˇáş DOCKERIMAGE áááşáááşá¸ááťááşááźáąáŹááşá¸áá˛áážáŻááᯠááźááşáááşá¸ááźáŽá¸ ááťá˝ááşáŻááşáááŻáˇáá ááşááž áá˝á˛ááźááşá¸á áááşááźáŹáááŻááąáŹ Dockerfile ááᯠáááŻááşáááŻáˇ áááşáááşáááşá /Dockerfile (á¤áááŻááşáááŻáˇ áááááááşá¸ááźáąáŹááşá¸ áááŻáĄááşááźáąáŹááşá¸ áááááźáŻááŤ)á
docker run --rm -v $(pwd)/results:/results -v $(pwd)/docker_security.df:/Dockerfile -e DOCKERIMAGE="bkimminich/juice-shop" dscan:image
[+] Setting environment variables
[+] Running Hadolint
/Dockerfile:3 DL3006 Always tag the version of an image explicitly
[+] Running Dockle
WARN - DKL-DI-0006: Avoid latest tag
* Avoid 'latest' tag
INFO - CIS-DI-0005: Enable Content trust for Docker
* export DOCKER_CONTENT_TRUST=1 before docker pull/build
INFO - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
* not found HEALTHCHECK statement
INFO - DKL-LI-0003: Only put necessary files
* unnecessary file : juice-shop/node_modules/sqlite3/Dockerfile
* unnecessary file : juice-shop/node_modules/sqlite3/tools/docker/architecture/linux-arm64/Dockerfile
* unnecessary file : juice-shop/node_modules/sqlite3/tools/docker/architecture/linux-arm/Dockerfile
[+] Running Trivy
...
juice-shop/package-lock.json
============================
Total: 20 (UNKNOWN: 0, LOW: 1, MEDIUM: 6, HIGH: 8, CRITICAL: 5)
...
[+] Making the output look pretty
[+] Starting the main module ============================================================
[+] Converting JSON results
[+] Writing results HTML
[+] Clean exit ============================================================
[+] Everything is done. Find the resulting HTML report in results.htmlááááşááťáŹá¸áááŻ
ááťá˝ááşáŻááşáááŻáˇáááş Docker artifacts áááŻá áááşááşáááşáááşáĄáá˝ááş áĄááźáąááśáĄááŻáśá¸áĄááąáŹááşáá ášá ááşá¸áĄá áŻáśáĄáááşáá áşááŻáááŻáᏠááźááˇáşáážáŻáá˛áˇááźáŽá¸á ááťá˝ááşáŻááşááĄááźááşáĄáá ááŻááşááŻáśááŻáśááźáŻáśááąá¸áááŻáĄááşááťááşááťáŹá¸á áááˇáşááťáąáŹáşááąáŹáĄá áááşáĄáááŻááşá¸áá áşááŻááᯠáĄáá˝ááşááááąáŹááşá á˝áŹ ááŻáśá¸áĄáŻááşááąá¸áááˇáş Docker áážáąá¸ááąáŹááşá¸áá ášá ááşá¸ááťáŹá¸ááᯠááťá˝ááşáŻááşáááŻáˇááźááˇáşáážáŻáá˛áˇáááşá áá°ááŽáááˇáşá á áşááąá¸áážáŻááťáŹá¸á áážáááąáŹáĄá áŽáááşááśá áŹááťáŹá¸áá˝á˛ááźááşá¸ áááŻáˇáááŻááş áá˝ááşáááŻá¸ááŻááşáá˝ááş áááşáááşáĄááŻááşááŻááşáááŻááşááąáŹ áĄáááąá¸áážááˇáş áĄááá˛áˇ ááááááŹááťáŹá¸á á˝áŹáááşá¸ áážáááŤáááşá á¤ááááááŹááťáŹá¸á ááźáŻáśááŻáśááŻáśá¸áááşááťááşáážááˇáş áááşá¸áááŻáˇááᯠááąáŤááşá¸á ááşá¸ááŻáśáááş áĄáááşá¸áááşááąáŹááşááťáážááąáŤáşááŹááŤáááşá .
á¤ááąáŹááşá¸ááŤá¸áá˝ááşááąáŹáşááźááŹá¸ááąáŹ ááááááŹáĄá áŻáśá ááąáŹááşá¸ááąáŹáĄááťááşáážáŹ áááşá¸áááŻáˇáĄáŹá¸ááŻáśá¸áááş open source ááźá áşááźáŽá¸ áááˇáşáááŻáĄááşááťááşáážááˇáş áĄááźáąááśáĄááąáŹááşáĄáĄáŻáśáážááˇáş áááŻááşááŽááąáŹáĄááŹááᯠáážáŹáá˝áąáááş áááşá¸áááŻáˇáážááˇáş áĄááźáŹá¸áĄááŹá¸áá°ááááááŹááťáŹá¸áážááˇáş á ááşá¸áááşáááŻááşáááşá ááąááťáŹááŤáááşá áá˝áąáˇáážáááááˇáş áĄáŹá¸áááşá¸ááťááşáĄáŹá¸ááŻáśá¸ááᯠááŽá¸ááźáŹá¸áĄááźáąáĄááąááťáŹá¸áá˝ááş áĄááŻáśá¸ááťáááŻááşá áąáááş ááąáˇááŹáááˇáşáááşá áááŻáˇááąáŹáş á¤áĄááŹáááş áĄááŹáááşááąáŹááşá¸ááŤá¸ááźáŽá¸áá áşááŻáĄáá˝ááş ááąáŤááşá¸á ááşáá áşááŻááźá áşáááşá
á¤áááşá¸áá˝ážááşááťááşá scripts áážááˇáş utilities ááťáŹá¸áááş áááˇáşáĄáŹá¸ áá°ááŽááąá¸ááźáŽá¸ áá˝ááşááááşááŹá§ááááŹáá˝ááş áááŻáááŻááŻáśááźáŻáśááąáŹ áĄááźáąááśáĄááąáŹááşáĄáŚáá
áşáᯠáááşááŽá¸áááşáĄáá˝ááş áĄá
áážááşááźá
áşááŹááááˇáşáááşáᯠááťážáąáŹáşáááˇáşááŤáááşá
source: www.habr.com
