見出し画像

332.1 ホストハーデニング


課題 332: ホストセキュリティ
332.1 ホストハーデニング

LPIC303の試験範囲である主題331~335まであるうちの「332: ホストセキュリティ」から「332.1 ホストハーデニング」についてのまとめ

  • 総重量:5

  • 説明:
    一般的な脅威に対して、Linuxが稼働しているコンピュータをよりセキュアにする。

  • 主要な知識範囲:

    • BIOSとboot loader(GRUB 2)セキュリティの設定。

    • 利用していないソフトウエアとサービスを無効化する。

    • 特定のsystemdユニットと全体システムに対して、不必要な機能を理解し削除する。

    • アドレス空間のランダム化(ASLR: Address Space Layout Randomization)、Data Execution Prevention (DEP) 、 Exec-Shieldを理解し設定する。

    • ブラックリスト・ホワイトリストに分けられたUSBデバイスを、USBGuardを利用して、コンピュータに接続する。

    • CAを利用してホストとユーザーキーのSSH CA、SSH証明書を作成し、OpenSSHがSSH証明書を利用するように設定する。

    • chroot環境での作業

    • システムコールとプロセスに対して有効な機能を制限するために、systemdユニットを利用する。

    • 特定のファイルやデバイスに、アクセスを制限したりアクセスさせないようにして、プロセスを起動するようにsystemdユニットを利用する。

    • 専用のテンポラリディレクトリや/devディレクトリがあり、ネットワークアクセスができない状態のプロセスを起動するように、systemdユニットを利用する。

    • プロセスが消費することができるシステムリソースを制限するように、systemdユニットを利用することができる。

    • Linux MeltdownとSpectreの回避策の影響の理解と、回避策の有効化・無効化。

    • polkitの知識

    • 仮想化とコンテナ化のセキュリティの利点の知識

  • 重要なファイル、用語、ユーティリティ:

    • grub.cfg

    • systemctl

    • getcap

    • setcap

    • capsh

    • sysctl

    • /etc/sysctl.conf

    • /etc/usbguard/usbguard-daemon.conf

    • /etc/usbguard/rules.conf

    • usbguard

    • ssh-keygen

    • /etc/ssh/

    • ~/.ssh/

    • /etc/ssh/sshd_config

    • chroot


BIOSとboot loader(GRUB 2)セキュリティの設定

設定ファイル

  • GRUB
    /boot/grub/grub.conf

  • GRUB2
    /boot/grub2/grub.cfg
    "/etc/default/grub" や "/etc/grub.d/40_custom" を編集して `grub2-mkconfig` や `update-grub` コマンドを実行する

  • UEFI
    /boot/efi/EFI/redhat/grub.cfg

コマンド

  • grub2-setpassword
    GRUB メニューエントリーを変更するためのパスワードを設定する
    コマンドを実行すると "/boot/grub2/user.cfg" が生成される。
    GRUB メニューに入ろうとするとユーザー名とパスワードの入力を求められる。
    ここのユーザー名は "root" になる。
    このパスワード保護を削除するには "/boot/grub2/user.cfg" を削除する。

  • grub2-mkpasswd-pbkdf2
    "/etc/grub.d/40_custom" で設定するパスワードをハッシュ化する

手順

起動したときのGRUBメニューで "e" を入力するとGRUBの設定画面に入ることができる。
このときのユーザーとパスワードは `grub2-setpassword` で設定するか "/etc/grub.d/40_custom"に記述することで設定できる。
なお、`grub2-setpassword` で設定したパスワードと、"/etc/grub.d/40_custom" に設定したユーザー/パスワード が両方設定されていた場合は、"/etc/grub.d/40_custom" の設定が優先されるようです。

"/etc/grub.d/40_custom" にユーザー名とパスワードを記述する★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# vi /etc/grub.d/40_custom
 :
set superusers="user01"
password user01 password01

[root@lpic303-rocky34 ~]#

★パスワードをハッシュ化したい時は `grub2-mkpasswd-pbkdf2` を使う★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# grub2-mkpasswd-pbkdf2
パスワードを入力してください:   <---★パスワードを入力
Reenter password:             <---★パスワードを再入力
PBKDF2 hash of your password is grub.pbkdf2.sha512.100**********15A
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# vi /etc/grub.d/40_custom
 :
set superusers="user01"
password_pbkdf2 user01 grub.pbkdf2.sha512.100**********15A

[root@lpic303-rocky34 ~]#`grub2-mkconfig`コマンドでGRUB2の設定ファイルを更新する★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /boot/grub2/grub.cfg
 :
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

set superusers="user01"
password user01 password01

### END /etc/grub.d/40_custom ###
 :
[root@lpic303-rocky34 ~]#



利用していないソフトウエアとサービスを無効化する

不要なパッケージを削除する

  • RPM系

    • yum remove

    • dnf remove

    • rpm -e

  • Debian系

    • apt remove <パッケージ名>
      設定ファイルなど一部が残る

    • apt purge <パッケージ名>
      設定ファイルなども含めてすべて削除する

    • dpkg -r | --remove  <パッケージ名>
      設定ファイルなど一部が残る

    • dpkg -P | --purge  <パッケージ名>
      設定ファイルなども含めてすべて削除する

サービスを無効化する

  • chkconfig <サービス名> off
    サービスを無効化する

  • systemctl disable <サービス名>
    サービスを無効化する
    --now をつけることで同時にサービスを停止させることができる

  • systemctl mask <サービス名>
    `systemctl unmask` しない限り`systemctl`コマンドで操作できなくなる



特定のsystemdユニットと全体システムに対して、不必要な機能を理解し削除する

<・・・調査中・・・>



ASLR、DEP、Exec-Shieldを理解し設定する

ASLR

Address Space Layout Randomization

アドレス空間配置のランダム化(ASLR)は、特定のタイプのバッファ・オーバーフロー攻撃を撃退するのに役立ちます。 ASLRでは、ベース、ライブラリ、ヒープ、スタックをプロセスのアドレス空間のランダムな位置に配置します。これにより、攻撃プログラムは次の命令のメモリー・アドレスを予測することが困難になります。 ASLRはLinuxカーネルに組み込まれており、パラメータ /proc/sys/kernel/randomize_va_space によって制御されます。 randomize_va_spaceパラメータは、次の値をとることができます。

0:ASLRを無効化します。 この設定は、カーネルがnorandmapsブート・パラメータでブートされる場合に適用されます。
1:スタック、仮想動的共有オブジェクト(VDSO)ページ、共有メモリー領域の位置をランダム化します。 データ・セグメントのベース・アドレスは、実行可能コード・セグメントの末尾の直後に配置されます。
2:スタック、VDSOページ、共有メモリー領域およびデータ・セグメントの位置をランダム化します。 これがデフォルトの設定です。

3.15.1 アドレス空間配置のランダム
★RockyLinux 9 の場合★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /proc/sys/kernel/randomize_va_space
2
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2
[root@lpic303-rocky34 ~]#


★Ubuntu 22.04の場合★
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# cat /proc/sys/kernel/randomize_va_space
2
root@lpic303-ubuntu35:~#
root@lpic303-ubuntu35:~# sysctl kernel.randomize_va_space
kernel.randomize_va_space = 2
root@lpic303-ubuntu35:~#

DPE

Data Execution Prevention

DEP(Data Execution Prevention/データ実行防止)はWindowsのセキュリティ機能の一種で、Windows XP SP2から搭載されています。

DEPは、ウイルスやセキュリティ脅威によるコンピューターへの被害を防止するために、プログラムによるシステムメモリーの使用を監視します。そのため、ワームウイルスがコンピューターの不正操作や乗っ取りをする際の手段である「バッファオーバーフロー攻撃」などを防止することが可能です。

【NTT西日本】DEP(Data Execution Prevention/データ実行防止)|ICT用語集|法人・ 企業向け ICT サービス ・ ソリューション

Exec-Shield

特定のメモリー領域から命令を実行できないようにするLinuxの機能。不正侵入を行う手段の1つである,バッファ・オーバーフロ-攻撃に対して有効な防御機能である。
 :
Exec-Shieldは,NXビット非対応のCPUでも動作するが,DEPはNXビットに非対応のCPUでは動作しない。

Exec-Shield | 日経クロステック(xTECH)

補足
ExecShieldはRHEL7で、デフォルト有効化され無効化できなくなているようです。

[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# grep -i nx /proc/cpuinfo
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 movbe popcnt aes rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ibrs_enhanced fsgsbase bmi1 bmi2 invpcid rdseed clflushopt md_clear flush_l1d arch_capabilities
                                                                      ↑
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# dmesg | grep -i nx
[    0.000000] NX (Execute Disable) protection: active
    :
[root@lpic303-rocky34 ~]#

CentOS6ではカーネルパラメータとして設定変更できた。

[root@CentOS6 ~]#
[root@CentOS6 ~]# echo 1 > /proc/sys/kernel/exec-shield
[root@CentOS6 ~]# cat /proc/sys/kernel/exec-shield
1
[root@CentOS6 ~]#

USBGuardの利用

USBデバイスの接続を制御する

usbguard サブコマンド

  • list-devices

  • allow-device <id|rule|p-rule>

  • block-device <id|rule|p-rule>

  • reject-device <id|rule|p-rule>

  • list-rules

  • append-rule <rule>

  • remove-rule <id>

  • generate-policy

実行例については、別記事『Appendix usbguard』参照

設定ファイル

  • /etc/usbguard/usbguard-daemon.conf

  • /etc/usbguard/rules.conf

[root@lpic303-rocky34 usbguard]#
[root@lpic303-rocky34 usbguard]# tree -aF /etc/usbguard/
/etc/usbguard/
├─ IPCAccessControl.d/
├─ rules.conf
├─ rules.d/
└─ usbguard-daemon.conf

2 directories, 2 files
[root@lpic303-rocky34 usbguard]#

参考


OpenSSHのSSH証明書を利用

SSH CA

従来、SSHサーバーとSSHクライアント間で証明書を使う場合には、SSHクライアントの公開鍵を `ssh-copy-id` コマンドを使うなどしてSSHサーバーに登録して利用していたが、よりセキュリティ強度を高めるためにSSHクライアント公開鍵をCA認証局によ署名してもらい、SSHサーバー側ではCA認証局の公開鍵でSSHクライアント公開鍵(CA署名済み)を検証して、不正アクセスを防ぐことができる。

手順

  1. CA認証局で鍵ペアを作成する
    ssh-keygen -f ca.key
    → "ca.key" と "ca.key.pub" が作られる

  2. SSHクライアントになるユーザー側で鍵ペアを作る
    ssh-keygen -f user.key
    → "user.key" と "user.key.pub" が作られる

  3. CA認証局の秘密鍵でユーザーの公開鍵に署名をする
    ssh-keygen -s <CA秘密鍵> -l <説明> -n <ユーザー> -V <期限> <ユーザー公開鍵>
    ssh-keygen -s ca.key -l "ca test" -n "user01" -V +1d user.key.pub
    → "user.key-cert.pub" が作られる
    ※確認:ssh-keygen -L -f user.key-cert.pub

  4. SSHサーバーにCA認証局の公開鍵を配置し "sshd_config" に追加設定をする
    TrustedUserCAKeys /etc/ssh/ca.key.pub
    AuthorizedPrincipalsFile /etc/ssh/authorizedprincipals

  5. "/etc/ssh/authorizedprincipals" にSSH接続するユーザーを登録
    echo "user01" > /etc/ssh/authorizedprincipals

参考


chroot環境での作業

chrootとは

chrootとは、「CHange ROOT」のことで、ルートディレクトリを変更する技術です。ここでのROOTとは特権ユーザではなく、ファイルシステムのルートディレクトリのことを指します。

UNIX系のファイルシステムは、「/」すなわちルートディレクトリを頂上としたツリー構造をとっています。このルートディレクトリを、たとえばですが「/var/chroot/」ディレクトリに変更する技術が「chroot」です。

chroot - Linux技術者認定 LinuC | LPI-Japan

実行例については、別記事『Appendix chroot』参照


systemdユニットを利用した機能の制限

コマンドで変更する

  • systemctl set-property <UNIT名> <設定項目=設定値>
    設定は即座に反映され、 "/etc/systemd/system.control" 以下に設定ファイルが生成されて再起動しても設定した値が保持されます。
    --runtime オプションをつけると一時的な変更となり、再起動すると元の値に戻ります。

"/etc/systemd/system.control"は空であることを確認★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ls -la /etc/systemd/system.control
合計 4
drwxr-xr-x. 2 root root    6  210 23:32 .
drwxr-xr-x. 5 root root 4096  210 23:26 ..
[root@lpic303-rocky34 ~]#`systemctl set-property`を実行★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemctl set-property httpd.service CPUShares=600 MemoryLimit=500M
[root@lpic303-rocky34 ~]#"/etc/systemd/system.control"にユニット名のディレクトリができる★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ls -la /etc/systemd/system.control
合計 4
drwxr-xr-x. 3 root root   29  210 23:34 .
drwxr-xr-x. 5 root root 4096  210 23:26 ..
drwxr-xr-x. 2 root root   58  210 23:34 httpd.service.d
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# ls -la /etc/systemd/system.control/httpd.service.d/
合計 8
drwxr-xr-x. 2 root root  58  210 23:34 .
drwxr-xr-x. 3 root root  29  210 23:34 ..
-rw-r--r--. 1 root root 145  210 23:34 50-CPUShares.conf
-rw-r--r--. 1 root root 153  210 23:34 50-MemoryLimit.conf
[root@lpic303-rocky34 ~]#

★生成された設定ファイルを確認する★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /etc/systemd/system.control/httpd.service.d/50-CPUShares.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Service]
CPUShares=600
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# cat /etc/systemd/system.control/httpd.service.d/50-MemoryLimit.conf
# This is a drop-in unit file extension, created via "systemctl set-property"
# or an equivalent operation. Do not edit.
[Service]
MemoryLimit=524288000
[root@lpic303-rocky34 ~]#
`systemctl revert`で設定をもとに戻す★
[root@lpic303-rocky34 ~]#
[root@lpic303-rocky34 ~]# systemctl revert httpd.service
Removed "/etc/systemd/system.control/httpd.service.d/50-CPUShares.conf".
Removed "/etc/systemd/system.control/httpd.service.d/50-MemoryLimit.conf".
Removed "/etc/systemd/system.control/httpd.service.d".
[root@lpic303-rocky34 ~]#

システムコールとプロセスに対して有効な機能を制限

  • systemd.exec

    • SystemCallFilter

    • SystemCallErrorNumber

    • SystemCallArchitectures

    • SystemCallLog

特定のファイルやデバイスにへのアクセスを制限

  • systemd.exec

    • ReadWritePaths

    • ReadOnlyPaths

    • InaccessiblePaths

    • ExecPaths

    • NoExecPaths

専用のテンポラリディレクトリや/devディレクトリを使ったネットワークアクセスの制限

システムリソースを制限

参考


Linux Meltdown、Spectreの回避策

概要

Meltdown、Spectre はいずれもプロセッサに存在するハードウェアレベルの脆弱性で、2018年に発表された。

主な対策

  • OSを最新化する または パッチを適用する

  • カーネルのアップデートをする

  • KPTI(Kernel Page Table Isolation)を利用する
    → パフォーマンス低下する可能性がある
    → メモリ使用量が増加する

Linux Meltdown

Meltdown(メルトダウン)とは、コンピュータ、スマートフォン、IoT家電など、マイクロプロセッサ(CPUなど)を使用する電子機器に幅広く存在するハードウェアレベルの脆弱性のひとつである。
 :
脆弱性の影響を受けるマイクロプロセッサは、インテルの大多数の製品とARMの一部の製品[4]であり、AMDの製品には影響しないとセキュリティ研究者によって考えられている。
CVE番号はCVE-2017-5754、脆弱性通称は"Rogue Data Cache Load"。
 :
対策
Linux
Linuxカーネルの開発者は、KPTI(kernel page-table isolation)と名付けたパッチ群を2018年初頭にカーネル4.15でリリースし、 これはカーネル4.9.75/4.14.11ではバックポートとしてリリースされた

Meltdown - Wikipedia

Spectre

Spectre(スペクター)は、今日の幅広いマイクロプロセッサに存在するハードウェアレベルの脆弱性であり、正当な権限のないプロセスが保護されたメモリの領域(例:サンドボックスの外側)にアクセスすることが可能になる。
 :
悪意あるプログラムが任意のメモリ領域(機密情報を含む可能性がある)の読み取りを可能とする、マイクロプロセッサの分岐予測・投機的実行の実装に含まれる脆弱性である。
 :
対策
ユーザランドの対策としては、他のメモリに対する攻撃同様、アドレス空間配置のランダム化 (ASLR)Position Independent Code (PIC) を組み合わせるなどして、メモリマップをランダム化する手法が知られており、この脆弱性でも有効とされている。また、LLVMにパッチを充てることで、同様の効果が得られる。

Spectre - Wikipedia

参考



polkitの知識

polkitとは

Polkit(旧名PolicyKit)とは、Unix系オペレーティングシステムで、システム全体の権限を制御するためのアプリケーション開発ツールキットである。このライブラリによって、特権を持たないプロセスが、特権を持つプロセスと通信することができるようになる。sudoのようなコマンドと比較すると、プロセス全体に対して特権を与えることはしない。しかし、1つのポリシーで、より細かなポリシーをシステム全体に対して適用できるという特徴がある。

Polkit - Wikipedia



仮想化とコンテナ化のセキュリティの利点

<・・・調査中・・・>



ケーパビリティ

ケーパビリティとは

特権をさらに細分化したケーパビリティと呼ばれる単位で取り扱えるようにし、プロセスに特権すべてを与えるのではなく、最小限のケーパビリティを与えて必要な処理を行わせようというものです。これにより、プロセスにもし脆弱性が発見されて悪用されたとしても、そのプロセスが必要とする最小限のケーパビリティしか奪われないため、被害の範囲を狭めることが可能になります。

権限を最小化するLinuxカーネルケーパビリティ - @IT

getcap

ファイルのケーパビリティを取得する

setcap

ファイルのケーパビリティを設定する

capsh

ケーパビリティを管理するコマンド

参考


sysctl

sysctlコマンド

  • -a, --all, -A, -X
    現在の設定を表示する

  • -n, --values
    指定した設定の値のみ表示

  • -p[FILE], --load[=FILE], -f
    設定ファイルを読み込む

  • -w, --write
    設定を変更する

設定ファイル

  • /proc/sys/
    ディレクトリをドットでつなぐと設定項目になる
    例) /proc/sys/net/ipv4/ip_forward → net.ipv4.ip_forward

  • /etc/sysctl.conf

  • /etc/sysctl.d/*.conf


参考文献


この記事が気に入ったらサポートをしてみませんか?