
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.confGRUB2
/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ページ、共有メモリー領域およびデータ・セグメントの位置をランダム化します。 これがデフォルトの設定です。
★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は、ウイルスやセキュリティ脅威によるコンピューターへの被害を防止するために、プログラムによるシステムメモリーの使用を監視します。そのため、ワームウイルスがコンピューターの不正操作や乗っ取りをする際の手段である「バッファオーバーフロー攻撃」などを防止することが可能です。
Exec-Shield
特定のメモリー領域から命令を実行できないようにするLinuxの機能。不正侵入を行う手段の1つである,バッファ・オーバーフロ-攻撃に対して有効な防御機能である。
:
Exec-Shieldは,NXビット非対応のCPUでも動作するが,DEPはNXビットに非対応のCPUでは動作しない。
補足
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署名済み)を検証して、不正アクセスを防ぐことができる。
手順
CA認証局で鍵ペアを作成する
ssh-keygen -f ca.key
→ "ca.key" と "ca.key.pub" が作られるSSHクライアントになるユーザー側で鍵ペアを作る
ssh-keygen -f user.key
→ "user.key" と "user.key.pub" が作られる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.pubSSHサーバーにCA認証局の公開鍵を配置し "sshd_config" に追加設定をする
TrustedUserCAKeys /etc/ssh/ca.key.pub
AuthorizedPrincipalsFile /etc/ssh/authorizedprincipals"/etc/ssh/authorizedprincipals" にSSH接続するユーザーを登録
echo "user01" > /etc/ssh/authorizedprincipals
参考
chroot環境での作業
chrootとは
chrootとは、「CHange ROOT」のことで、ルートディレクトリを変更する技術です。ここでのROOTとは特権ユーザではなく、ファイルシステムのルートディレクトリのことを指します。
UNIX系のファイルシステムは、「/」すなわちルートディレクトリを頂上としたツリー構造をとっています。このルートディレクトリを、たとえばですが「/var/chroot/」ディレクトリに変更する技術が「chroot」です。
実行例については、別記事『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 2月 10 23:32 .
drwxr-xr-x. 5 root root 4096 2月 10 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 2月 10 23:34 .
drwxr-xr-x. 5 root root 4096 2月 10 23:26 ..
drwxr-xr-x. 2 root root 58 2月 10 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 2月 10 23:34 .
drwxr-xr-x. 3 root root 29 2月 10 23:34 ..
-rw-r--r--. 1 root root 145 2月 10 23:34 50-CPUShares.conf
-rw-r--r--. 1 root root 153 2月 10 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 ~]#
システムコールとプロセスに対して有効な機能を制限
SystemCallFilter
SystemCallErrorNumber
SystemCallArchitectures
SystemCallLog
特定のファイルやデバイスにへのアクセスを制限
ReadWritePaths
ReadOnlyPaths
InaccessiblePaths
ExecPaths
NoExecPaths
専用のテンポラリディレクトリや/devディレクトリを使ったネットワークアクセスの制限
TemporaryFileSystem
PrivateTmp
PrivateDevices
PrivateNetwork
ProtectSystem
ProtectHome
システムリソースを制限
LimitCPU
LimitFSIZE
LimitNOFILE
CPUQuota
参考
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ではバックポートとしてリリースされた
Spectre
Spectre(スペクター)は、今日の幅広いマイクロプロセッサに存在するハードウェアレベルの脆弱性であり、正当な権限のないプロセスが保護されたメモリの領域(例:サンドボックスの外側)にアクセスすることが可能になる。
:
悪意あるプログラムが任意のメモリ領域(機密情報を含む可能性がある)の読み取りを可能とする、マイクロプロセッサの分岐予測・投機的実行の実装に含まれる脆弱性である。
:
対策
ユーザランドの対策としては、他のメモリに対する攻撃同様、アドレス空間配置のランダム化 (ASLR) とPosition Independent Code (PIC) を組み合わせるなどして、メモリマップをランダム化する手法が知られており、この脆弱性でも有効とされている。また、LLVMにパッチを充てることで、同様の効果が得られる。
参考
polkitの知識
polkitとは
Polkit(旧名PolicyKit)とは、Unix系オペレーティングシステムで、システム全体の権限を制御するためのアプリケーション開発ツールキットである。このライブラリによって、特権を持たないプロセスが、特権を持つプロセスと通信することができるようになる。sudoのようなコマンドと比較すると、プロセス全体に対して特権を与えることはしない。しかし、1つのポリシーで、より細かなポリシーをシステム全体に対して適用できるという特徴がある。
仮想化とコンテナ化のセキュリティの利点
<・・・調査中・・・>
ケーパビリティ
ケーパビリティとは
特権をさらに細分化したケーパビリティと呼ばれる単位で取り扱えるようにし、プロセスに特権すべてを与えるのではなく、最小限のケーパビリティを与えて必要な処理を行わせようというものです。これにより、プロセスにもし脆弱性が発見されて悪用されたとしても、そのプロセスが必要とする最小限のケーパビリティしか奪われないため、被害の範囲を狭めることが可能になります。
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