Ultimate DevSecOps Bootcamp by School of Devops: System Security Auditing with IaaC


Делаю:
2026.01.03


Мы тестируем linux машину на предмет уязвимостей


На удаленном хосте 192.168.1.12

Выдать права, чтобы можно было выполнять sudo без пароля.

$ sudo apt update -y && sudo apt upgrade -y
$ sudo apt install -y ansible


// Требуется license ID
https://www.chef.io/license-generation-free-trial
Here is your license key: free-72b8655e-a93d-45f6-b12a-f871ef1f5d0e-3709


If you are using Chef Automate, please use below license JWT token:

eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImZyZWUtNzJiODY1NWUtYTkzZC00NWY2LWIxMmEtZjg3MWVmMWY1ZDBlLTM3MDkiLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJmcmVlIiwiZ2VuZXJhdG9yIjoiY2hlZi9saWNlbnNlLShkZXZlbCkiLCJrZXlfc2hhMjU2IjoiZTBkZjI4YzhiYzY4MTUwZWRiZmVmOThjZDZiN2RjNDM5YzFmODBjN2U3ZWY3NDc4OTNhNjg5M2EyZjdiNjBmNyIsImdlbmVyYXRlZF9kYXRlIjp7InNlY29uZHMiOjE3Njc0NDE4NzV9LCJjdXN0b21lciI6Ik1heG11ZCBNYWdvbWVkb3YiLCJjdXN0b21lcklkIjoieDB6bGhAYWlyc3dvcmxkLm5ldCIsImN1c3RvbWVyX2lkX3ZlcnNpb24iOiIxIiwiZW50aXRsZW1lbnRzIjpbeyJuYW1lIjoiSGFiaXRhdCIsIm1lYXN1cmUiOiJub2RlIiwibGltaXQiOjEwLCJzdGFydCI6eyJzZWNvbmRzIjoxNzY3Mzk4NDAwfSwiZW5kIjp7InNlY29uZHMiOjE3OTg5MzQ0MDB9fSx7Im5hbWUiOiJJblNwZWMiLCJtZWFzdXJlIjoibm9kZSIsImxpbWl0IjoxMCwic3RhcnQiOnsic2Vjb25kcyI6MTc2NzM5ODQwMH0sImVuZCI6eyJzZWNvbmRzIjoxNzk4OTM0NDAwfX0seyJuYW1lIjoiSW5mcmEiLCJtZWFzdXJlIjoibm9kZSIsImxpbWl0IjoxMCwic3RhcnQiOnsic2Vjb25kcyI6MTc2NzM5ODQwMH0sImVuZCI6eyJzZWNvbmRzIjoxNzk4OTM0NDAwfX0seyJuYW1lIjoiV29ya3N0YXRpb24iLCJtZWFzdXJlIjoibm9kZSIsImxpbWl0IjoxMCwic3RhcnQiOnsic2Vjb25kcyI6MTc2NzM5ODQwMH0sImVuZCI6eyJzZWNvbmRzIjoxNzk4OTM0NDAwfX0seyJuYW1lIjoiQ2hlZiBDb3VyaWVyIiwibWVhc3VyZSI6Im5vZGUiLCJsaW1pdCI6MTAsInN0YXJ0Ijp7InNlY29uZHMiOjE3NjczOTg0MDB9LCJlbmQiOnsic2Vjb25kcyI6MTc5ODkzNDQwMH19LHsibmFtZSI6IkNoZWYgUGxhdGZvcm0iLCJtZWFzdXJlIjoibm9kZSIsImxpbWl0IjoxMCwic3RhcnQiOnsic2Vjb25kcyI6MTc2NzM5ODQwMH0sImVuZCI6eyJzZWNvbmRzIjoxNzk4OTM0NDAwfX0seyJuYW1lIjoiQXV0b21hdGUiLCJtZWFzdXJlIjoibm9kZSIsImxpbWl0IjoxLCJzdGFydCI6eyJzZWNvbmRzIjoxNzY3Mzk4NDAwfSwiZW5kIjp7InNlY29uZHMiOjE3OTg5MzQ0MDB9fV19.AAd5pdr-Oam6sr9vf4Tdbm_LB2oxdAmVtjgdL0-iT4RDvssuqGPZAnIiKeTZw1J1GKzsA1FCcNZxw8rajBWYY4IFAR5gjP-NEbyVsH6KK6rWfjz5YE8g4mok5kzZpiKdHhazR_Q29q19RqFdMbBNaObUsB29vPitoa1bFM3etBlbQpD7


$ curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec


$ inspec version
6.8.24


$ cd ~/tmp
$ git clone https://github.com/dev-sec/linux-baseline.git


$ inspec exec ~/tmp/linux-baseline
Profile Summary: 28 successful controls, 29 control failures, 1 control skipped
Test Summary: 123 successful, 60 failures, 2 skipped


$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/marley
$ ssh-keygen -t rsa -b 4096 -m PEM


$ chmod 600 ~/.ssh/marley
$ chmod 644 ~/.ssh/marley.pub


$ cat marley.pub >> ~/.ssh/authorized_keys


Install Essential Plugins

Browse to Manage Jenkins -> Manage Plugins -> Available

http://192.168.49.2:30264/manage/pluginManager/available


Последняя версия не FAIL!

Версия 2.0.79.v1d1b_5f76dda_8 OK!
https://plugins.jenkins.io/ssh-steps/releases/

  • SSH Pipeline Steps


// Добавьте в Jenkins:
// Jenkins → Manage Jenkins → Credentials → System → Global credentials → Add Credentials
http://192.168.49.2:30264/manage/credentials/store/system/domain/_/newCredentials


Kind: SSH Username with private key
Scope: Global (Jenkins, nodes, items, all child items, etc)
ID: sshUser
Description: SSH User
Username: marley
key: OPENSSH PRIVATE KEY


Fork -> https://github.com/lfs262/secops/


В Jenkins файле указываем:

remote.host = “192.168.1.12”


Enforcing Compliance with Ansible

$ git clone https://github.com/wildmakaka/secops.git
$ cd secops/ansible


$ ansible -i environments/prod all -m ping
localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.10"
    },
    "changed": false,
    "ping": "pong"
}


$ ansible-galaxy collection install devsec.hardening


$ sudo ansible-playbook compliance.yaml


$ inspec exec --no-distinct-exit ~/tmp/linux-baseline/
Profile Summary: 53 successful controls, 2 control failures, 3 controls skipped
Test Summary: 178 successful, 4 failures, 3 skipped


    stage("Scan with InSpec") {
        sshCommand remote: remote, sudo: false, command: 'inspec exec ~/tmp/linux-baseline/'
    }


Debug

        stage("whoami") {
            sshCommand remote: remote, sudo: true, command: 'whoami'
        }