Mengonfigurasi dan Memeriksa Kepatuhan CIS

Dokumen ini menjelaskan apa itu CIS Benchmark, bagaimana benchmark berkaitan dengan Container-Optimized OS (COS), cara mengaudit status kepatuhan dalam instance, dan cara memecahkan masalah jika terjadi kegagalan.

Ringkasan

Center for Internet Security (CIS) merilis tolok ukur untuk rekomendasi praktik terbaik keamanan untuk berbagai platform. Container-Optimized OS CIS Benchmark adalah serangkaian rekomendasi untuk mengonfigurasi instance yang menggunakan Container-Optimized OS untuk mendukung postur keamanan yang kuat. Baik gambar COS x86 dan ARM sesuai dengan CIS.

Mengakses Tolok Ukur

Container-Optimized OS CIS Benchmark tersedia di situs CIS:

Tingkat rekomendasi keamanan

CIS menentukan tingkat rekomendasi berikut untuk Container-Optimized OS.

Level 1

Rekomendasi pada tingkat ini dimaksudkan untuk berlaku pada sebagian besar lingkungan. Tingkat ini mencakup rekomendasi seperti berikut:

  • Pengacakan tata letak ruang alamat diaktifkan
  • /tmp tidak dapat digunakan untuk menjalankan biner yang dapat dieksekusi
  • Pengiriman pengalihan paket dinonaktifkan

Level 2

Rekomendasi di level ini memperluas rekomendasi Level 1, sehingga menghasilkan lingkungan keamanan yang lebih ketat. Rekomendasi Level 2 tidak selalu berlaku untuk semua kasus karena rekomendasi tersebut mungkin memerlukan perubahan aplikasi. Anda harus mengevaluasi rekomendasi di Level 2 untuk lingkungan Anda sebelum menerapkannya. Tingkat ini mencakup rekomendasi seperti berikut:

  • Aturan firewall tersedia untuk semua port yang terbuka
  • Pengalihan ICMP dan iklan router tidak diterima
  • Waktu tunggu shell pengguna default adalah 900 detik atau kurang

Cara Container-Optimized OS mematuhi Tolok Ukur CIS

Mulai dari Milestone 97, image OS yang Dioptimalkan untuk Container mematuhi CIS Level 1 secara default dan memberikan opsi untuk mematuhi CIS Level 2. Kami juga menyediakan pemindai yang dapat Anda gunakan untuk mengaudit instance berdasarkan tingkat rekomendasi CIS.

Konfigurasi CIS yang menentukan rekomendasi tersedia di /usr/share/google/security/cis-compliance/cis_config.textproto. Pemindai CIS menggunakan konfigurasi untuk memeriksa status kepatuhan instance. Hasil dari setiap pengoperasian pemindai kepatuhan tingkat CIS akan ditulis ke /var/lib/google/cis_scanner_scan_result.textproto. File ini ditimpa pada setiap pengoperasian pemindai CIS. Jika salah satu pemindaian CIS Level 1 atau Level 2 gagal, file cis_scanner_scan_result.textproto akan berisi daftar semua pemeriksaan yang gagal.

Memeriksa status kepatuhan instance

Container-Optimized OS image menyediakan layanan bersistem berikut untuk pemeriksaan dan konfigurasi kepatuhan:

  • cis-level1.service: Diaktifkan secara default dan dimulai saat booting. Ketika layanan dimulai, layanan akan memeriksa apakah instance mematuhi CIS Level 1.
  • cis-level2.service: Dinonaktifkan secara default. Layanan ini memungkinkan Anda mengonfigurasi instance agar mematuhi CIS Level 2, dan memeriksa status kepatuhan terhadap Level 1 dan Level 2.

Bagian berikut menjelaskan cara memeriksa status kepatuhan instance dan cara mengotomatiskan proses audit.

Periksa status kepatuhan CIS Level 1

Untuk melihat apakah instance Anda mematuhi CIS Level 1, periksa status cis-level1.service:

systemctl status cis-level1

Outputnya mirip dengan hal berikut ini:

Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 62 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto

Jika ditemukan pemeriksaan yang tidak mematuhi kebijakan, lihat Pemeriksaan kepatuhan Level 1/Level 2 gagal.

cis-level1.service hanya akan memeriksa kepatuhan CIS Level 1 sekali, saat instance di-booting. Untuk mengonfigurasi pemeriksaan kepatuhan berkala, lihat Pemeriksaan berkala status kepatuhan CIS.

Konfigurasikan kepatuhan CIS Level 2 dan periksa status

Anda dapat menggunakan layanan cis-level2 untuk mengonfigurasi instance agar mematuhi CIS Level 2 dan memeriksa status kepatuhan terhadap Level 1 dan Level 2. Layanan yang sistemnya mendukung semua rekomendasi CIS Level 2, kecuali untuk hal berikut:

  • 4.1.1.2 Memastikan Logging berjalan (ID: logging-service-running)

    Rekomendasi ini tidak diikutsertakan secara default, tetapi dapat diaktifkan kembali dengan menghapus ID dari daftar tidak ikut serta yang dapat ditemukan di file /etc/cis-scanner/env_vars. Pemeriksaan ini hanya ada di versi 109 dan yang lebih baru. Pada pencapaian sebelumnya, mengaktifkan Logging sendiri akan membuat Anda mematuhi rekomendasi ini. Jika Anda mengurungkan pilihan tidak ikut, menjalankan layanan cis-level2 akan menjalankan skrip yang memulai logging bit yang fasih. Tetap pilih tidak ikut logging-service-running jika Anda tidak ingin menggunakan logging default kami atau ingin menggunakan logging Anda sendiri.

Untuk rekomendasi berikut, layanan cis-level2 mengonfigurasi instance, tetapi tidak memverifikasi status kepatuhan:

  • 105 dan yang lebih rendah:

    • 3.3.1.1 Memastikan kebijakan tolak firewall default IPv6
    • 3.3.1.2 Memastikan lalu lintas loopback IPv6 dikonfigurasi
    • 3.3.1.3 Memastikan koneksi keluar dan tersambung IPv6 telah dikonfigurasi
    • 3.3.1.4 Memastikan aturan firewall IPv6 ada untuk semua port yang terbuka
    • 3.3.2.1 Memastikan kebijakan tolak default
    • 3.3.2.2 Memastikan loopback traffic dikonfigurasi
    • 3.3.2.3 Memastikan koneksi keluar dan tersambung dikonfigurasi
  • 109 dan yang lebih baru:

    • 3.3.1.4 Memastikan aturan firewall IPv6 ada untuk semua port yang terbuka

Layanan cis-level2 dinonaktifkan secara default. Untuk memulai layanan, jalankan perintah berikut:

systemctl start cis-level2.service

Untuk melihat apakah instance Anda berhasil dikonfigurasi dan mematuhi rekomendasi CIS Level 2, periksa status cis-level2.service:

systemctl status cis-level2

Outputnya mirip dengan hal berikut ini:

Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 112 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto

Jika konfigurasi instance gagal atau ditemukan pemeriksaan yang tidak mematuhi kebijakan, lihat Pemecahan masalah.

Layanan cis-level2 mengonfigurasi instance dan memeriksa kepatuhan CIS Level 2 hanya sekali. Untuk mengonfigurasi pemeriksaan kepatuhan berkala, lihat Pemeriksaan berkala status kepatuhan CIS.

Pemeriksaan berkala status kepatuhan CIS

Image OS yang Dioptimalkan untuk Container mencakup layanan berikut untuk memeriksa kepatuhan CIS secara berkala:

  • cis-compliance-pemindai.service: memeriksa status kepatuhan berdasarkan variabel lingkungan yang ditentukan di /etc/cis-scanner/env_vars. Secara default, layanan ini memeriksa kepatuhan CIS Level 1 dan dinonaktifkan.
  • cis-compliance-pemindai.timer: berjalan cis-compliance-scanner.service secara berkala. Periode default adalah sekali sehari.

Mengonfigurasi layanan pemindai

cis-compliance-scanner.service bertanggung jawab untuk memeriksa status kepatuhan CIS berdasarkan variabel lingkungan yang ditentukan di /etc/cis-scanner/env_vars. Secara default, layanan ini memeriksa kepatuhan CIS Level 1.

Untuk memeriksa kepatuhan CIS Level 2, tetapkan variabel lingkungan LEVEL di /etc/cis-scanner/env_vars ke 2. File /etc/cis-scanner/env_vars mirip dengan yang berikut ini:

# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="2"
# Extra options that can be passed to cis_scanner
# For valid options, see output of `cis_scanner -h`
EXTRA_OPTIONS=""

Mengonfigurasi timer

Untuk menyiapkan pemindaian kepatuhan berkala, mulai unit cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Secara default, cis-compliance-scanner.timer mulai cis-compliance-scanner.service sekali sehari. Untuk mengubah periode pemindaian, ganti kolom OnUnitActiveSec pada unit cis-compliance-scanner.timer:

sudo mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
sudo tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
[Unit]
Description=Run CIS Scanner once an hour
[Timer]
OnUnitActiveSec=1h
EOF

Contoh ini menetapkan periode pemindai menjadi sekali setiap jam.

Untuk menerapkan perubahan, muat ulang unit sistem:

systemctl daemon-reload

Memilih tidak ikut pemeriksaan kepatuhan CIS tertentu

Rekomendasi CIS Level 1 dan Level 2 dibuat agar dapat diterapkan pada sebagian besar lingkungan. Namun ,beberapa rekomendasi mungkin tidak berlaku untuk lingkungan spesifik Anda. Untuk memilih tidak mengikuti rekomendasi tertentu, gunakan variabel lingkungan EXTRA_OPTIONS di /etc/cis-scanner/env_vars.

Contoh file env_vars berikut memilih tidak ikut rekomendasi etc-passwd-permissions:

# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="1"
# Extra options that can be passed to cis_scanner
# For valid options:`cis_scanner -h`
EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"

Mengotomatiskan pengaktifan dan pemeriksaan status kepatuhan CIS

Anda dapat mengotomatiskan proses pemeriksaan kepatuhan untuk instance Anda menggunakan Kebijakan OS atau Cloud-init. Contoh berikut menunjukkan beberapa kasus penggunaan dengan setiap alat:

  • Contoh 1: periksa kepatuhan CIS Level 1 sekali sehari.
  • Contoh 2: periksa kepatuhan CIS Level 1 satu jam sekali.
  • Contoh 3: periksa kepatuhan CIS Level 2 sekali sehari.
  • Contoh 4: memilih tidak ikut pemeriksaan kepatuhan CIS tertentu.

Menggunakan cloud-init

Sebelum mencoba contoh berikut, pastikan Anda sudah terbiasa mengonfigurasi instance COS dengan cloud-init dengan mengikuti petunjuk di Menggunakan cloud-init dengan format Cloud config.

Contoh 1

Contoh konfigurasi berikut memulai pemindaian CIS Level 1 berkala dengan periode default sekali sehari.

#cloud-config

runcmd:
# Check the compliance status of the instance once a day.
- systemctl start cis-compliance-scanner.timer

Contoh 2

Contoh berikut mengonfigurasi pemindaian CIS Level 1 berkala setiap satu jam.

#cloud-config

# Override cis-compliance-scanner.timer with 1 hour frequency.
write_files:

- path: /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf
  permissions: 0600
  owner: root
  content: |
    [Unit]
    Description=Run CIS Scanner once an hour

    [Timer]
    OnUnitActiveSec=1h

runcmd:
# Reload systemd units.
- systemctl daemon-reload
# Check the compliance status of the instance once an hour.
- systemctl start cis-compliance-scanner.timer

Contoh 3

Contoh berikut mengonfigurasi pemindaian CIS Level 2 berkala dengan periode default sekali sehari.

#cloud-config

runcmd:
# Configure the instance for CIS level 2.
- systemctl start cis-level2.service
# Change the scan level to CIS Level 2.
- sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars
# Check the compliance status of the instance once a day.
- systemctl start cis-compliance-scanner.timer

Contoh 4

Contoh berikut mengonfigurasi pemindai untuk dijalankan sekali sehari dan memilih untuk tidak mengikuti rekomendasi CIS tertentu.

#cloud-config

runcmd:
# Opt-out of the etc-passwd-permissions check.
- sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars
# Check the compliance of the instance once a day.
- systemctl start cis-compliance-scanner.timer

Menggunakan Kebijakan OS

Anda dapat menggunakan Kebijakan OS untuk mengonfigurasi pemindaian CIS Benchmark. Sebelum memulai, pastikan Anda memahami Kebijakan OS, termasuk hal-hal berikut:

Selain itu, Anda harus menambahkan opsi instanceFilter dan rollout dalam contoh berikut untuk deployment.

Contoh 1

Contoh konfigurasi berikut memulai pemindaian CIS Level 1 berkala dengan periode default sekali sehari.

# An OS policy to check CIS level 1 compliance once a day.
osPolicies:
- id: ensure-cis-level1-compliance-once-a-day-policy
  mode: ENFORCEMENT
  resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # COS 97 images are by-default CIS Level 1 compliant and there is no
          # additional configuration needed. However, if certain changes
          # cause non-compliance because of the workload on the instance, this
          # section can be used to automate to make fixes. For example, the
          # workload might generate a file that does not comply with the
          # recommended file permissions.
          # Return an exit code of 100 to indicate that the desired changes
          # successfully applied.
          script: |-
            # optional <your code>
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

Contoh 2

Contoh berikut mengonfigurasi pemindaian CIS Level 1 berkala setiap satu jam.

# An OS policy to check CIS level 1 compliance once an hour.
osPolicies:
- id: ensure-cis-level1-compliance-once-an-hour-policy
  mode: ENFORCEMENT
  resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-an-hour
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Overwrite "OnUnitActiveSec" field of the
            # cis-compliance-scanner.timer to trigger
            # cis-compliance-scanner.service once an hour
            # instead of once a day.
            mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
            tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
            [Unit]
            Description=Run CIS Scanner once an hour

            [Timer]
            OnUnitActiveSec=1h
            EOF
            # Reload systemd units.
            systemctl daemon-reload
            # Check the compliance of the instance once an hour.
            systemctl start cis-compliance-scanner.timer && exit 100

Contoh 3

Contoh berikut mengonfigurasi pemindaian CIS Level 2 berkala dengan periode default sekali sehari.

# An OS policy to check CIS level 2 compliance once a day.
osPolicies:
- id: ensure-cis-level2-compliance-once-a-day-policy
  mode: ENFORCEMENT
  resourceGroups:
  - resources:
      id: ensure-cis-level2-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Configure the instance for CIS level 2.
            systemctl start cis-level2.service
            # Change the scan level to 2.
            sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

Contoh 4

Contoh berikut mengonfigurasi pemindai untuk dijalankan sekali sehari dan memilih untuk tidak mengikuti rekomendasi CIS tertentu.

# An OS policy to opt-out of CIS check and check compliance status once a day.
osPolicies:
- id: exclude-cis-check-and-check-compliance-once-a-day-policy
  mode: ENFORCEMENT
  resourceGroups:
  - resources:
      id: exclude-cis-check-and-check-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Opt-out of the etc-passwd-permissions check.
            sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars &&
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer
            # Ensure cis-compliance-scanner completes before exiting
            PID=$(systemctl show --property MainPID --value cis-compliance-scanner.service) &&
            timeout 5m bash -c -- 'while [ -e /proc/'$PID' ]; do echo "CIS Scanner with PID:'$PID' is still running"; sleep 1; done' &&
            exit 100

Pemecahan masalah

Bagian ini menjelaskan cara menyelesaikan masalah terkait pemindaian benchmark CIS.

Gagal mengonfigurasi instance untuk mematuhi rekomendasi CIS Level 2

Layanan cis-level2 terlebih dahulu mengonfigurasi instance untuk mematuhi rekomendasi CIS Level 2, lalu memeriksa kepatuhan terhadap CIS Level 1 dan Level 2. Jika konfigurasi instance gagal, layanan cis-level2 akan keluar dengan pesan error berikut:

Job for cis-level2.service failed because the control process exited with error code.
See "systemctl status cis-level2.service" and "journalctl -xeu cis-level2.service" for details.

Log jurnal akan menyebutkan rekomendasi yang gagal diterapkan pada instance dan mengakibatkan kegagalan layanan sistem cis-level2.

Pemeriksaan kepatuhan CIS Level 1 atau Level 2 gagal

Hasil pemindaian untuk setiap penerapan tingkat kepatuhan CIS ditulis di /var/lib/google/cis_scanner_scan_result.textproto. Jika pemindaian CIS Level 1 atau Level 2 gagal, file textproto akan berisi daftar semua pemeriksaan yang gagal, seperti dalam contoh berikut:

cat /var/lib/google/cis_scanner_scan_result.textproto

# Output
start_time: {
  seconds: 1648241700
  nanos: 763152171
}
end_time: {
  seconds: 1648241700
  nanos: 812992527
}
scanner_version: "1.1.4.3"
benchmark_version: "1.0.0"
status: {
  status: SUCCEEDED
}
non_compliant_benchmarks: {
  id: "etc-passwd-permissions"
  compliance_occurrence: {
    non_compliant_files: {
      path: "/etc/passwd"
      reason: "File permission is 0664, expected the following bits to be set: 0444 and the following bits to be clear: 0133"
    }
  }
}
compliant_benchmarks:  {
  id:  "etc-passwd-permissions"
  compliance_occurrence:  {}
}

Untuk mengurangi kegagalan pemeriksaan, gunakan CIS Benchmark lalu ikuti langkah-langkah di bagian Remediation untuk pemeriksaan yang gagal agar instance mematuhi kebijakan. Untuk menemukan rekomendasi mana yang sesuai dengan pemeriksaan yang gagal di CIS Benchmark, cari ID non_compliant_benchmark's di file konfigurasi pemindai CIS yang terletak di /usr/share/google/security/cis-compliance/cis_config.textproto.