7. ホストのセキュリティ
7.1. ホストセキュリティの強化
7.1.1. カーネルセキュリティ
不要なソフトウェアを無効化
実行中のすべてのプログラムには、セキュリティ上の脅威が存在する可能性があるため、使用されていないサービスを無効にすることは、セキュリティ上の良い設定となる。
サービスの無効化にはsystemctl
およびchkconfig
を使用することで可能。
一般的に無効化するサービスには、atd、ava hi-daemon、cups がある。
リソース使用量の制限
ユーザーはスレッド、開いているファイル、メモリなどのシステムリソースを制限することができる。
paml_limits.so
モジュールを使用すると、オペレーターはハード制限およびソフト制限を通じてユーザーがアクセスできる 1 つのリソースの量を制御できる。
ulimit
コマンドでもユーザーがアクセスできるリソース量を制限可能。
また恒久的な設定は/etc/security/limits.conf
で可能。
オプション | 説明 |
---|---|
-a | 現在設定されている値を全て表示 |
-f | シェルとその子によって書き込まれるファイルの最大サイズ |
-t | 最大 CPU 時間 (秒単位) |
-u | 1 人のユーザーが使用できるプロセスの最大数 |
-T | スレッドの最大数 |
カーネルパラメータのチューニング
sysctl
コマンドは、カーネルパラメータを表示および設定できる。
# 設定の全表示
sysctl -a
# カーネルパラメータからの表示
sysctl -n
# 設定の検索
sysctl -ar [検索パターン]
procfs
# 設定の保存
sysctl -w <param>=<value>
# 恒久的な設定の記述ファイル
/etc/sysctl.conf
# /etc/sysctl.confからの反映(ファイルから読み込む)
sysctl -p
7.1.2. Linuxの機能
プロセス機能
特定のプロセスの機能を確認するには/proc
ディレクトリ内のステータスファイルを確認する。
cat /proc/self/status
で現在で実行中のプロセスを、capsh --print
または/proc/<pid>/status
で他のユーザの実行中のプロセスを確認できる。
上記コマンドで表示される各行は以下内容を意味する。
- CapInh ... 継承された機能
- CapPrm ... 許可される機能
- CapEff ... 有効な能力
- CapBnd ... 境界セット
- CapAmb ... アンビエント機能セット
また、実行中のプロセスの機能を確認するには、getpcaps
ツールの後にプロセス ID (PID) を続けて使用することでできる。
バイナリ機能
バイナリには、実行中に使用できる機能を含めることができる。
たとえば、cap_net_raw
のような機能をping持つバイナリを見つけるのは非常に一般的となる。
バイナリ検索はgetcap -r / 2>/dev/null
で行える。
capsh による機能の削除
pingのCAP_NET_RAW
機能を削除すると、ping ユーティリティは機能しなくなる。
バイナリ機能の削除
バイナリの機能を削除するには以下コマンドで行える。
7.1.3. USBGuard
USBGuard ソフトウェア は、デバイス属性に基づいた基本的なホワイトリスト機能とブラックリスト機能を実装することにより、USB デバイスに対するシステム保護を提供する。 ユーザー定義のポリシーを強制するために、USBGuard はLinux カーネルの USB デバイス認証機能を使用する。 USBGuardフレームワークは次のコンポーネントを提供する。
- 動的対話とポリシー適用のためのプロセス間通信 (IPC) インターフェイスを備えたデーモンコンポーネント
- 実行中のUSBGuardインスタンスと対話するためのCLI
- USB デバイス認証ポリシーを記述するためのルール言語
- 共有ライブラリに実装されたデーモンコンポーネントと対話するための C++ API
USBGuardの機能
# 初期ルールセットを作成する
usbguard generate-policy > /etc/usbguard/rules.conf
# USBGuard ルール セットをカスタマイズする
vi /etc/usbguard/rules.conf
# USBGuard デーモンを起動する
systemctl enable usbguard.service
# USBGuard によって認識されるすべての USB デバイスをリストする
usbguard list-devices
# デバイスがシステムと対話することを許可する
usbguard allow-device <device-num>
# デバイスを認証解除してシステムから削除する
usbguard reject-device <device-num>
# デバイスの認証を解除するだけ
usbguard block-device <device-num>
またUSBGuardでは、block
および拒reject
という用語を次の意味で使用する。
block
... 現在このデバイスと通信しないようにするreject
... このデバイスを存在しないかのように扱う
ホワイトリスト/ブラックリストの作成
ホワイトリスト/ブラックリストはusbguard-daemon.conf
によりロードされ、デーモンの実行時パラメータの構成に使用される。
ホワイトリストまたはブラックリストを作成するには、/etc/usbguard/usbguard-daemon.conf
ファイルを編集し、そのオプションを使用することで実現できる。
RedHat系におけるUSBGuard
USBGuardのデーモンはUSBGuardパブリックIPCインターフェイスを提供する。 このインターフェイスへのアクセスはRedHat系の場合、rootユーザーのみに制限されている。
アクセス制限にはIPCAccessControlFiles
オプション、またはIPCAllowedUsers
オプションの設定で制御できる。
なお必ずIPCAllowedGroups
オプションの設定も行う必要があり、これを行わない場合、IPCインターフェイスがすべてのローカルユーザーに公開され、USB デバイスの認証状態を操作したり、USBGuardポリシーを変更したりできるようになってしまう。
7.2.4. ASLRの管理
ASLR(Address Space Layout Randomization)はプログラムがロードされるたびに、メモリ内の異なる場所にロードされるようにする仕組みのこと。
ASLR の設定または設定解除はカーネル パラメータによって制御される。
設定すべきカーネルパラメータはkernel.randomize_va_space
となる。
各値毎の動作は以下の通り。
0
... ALSR が無効1
... ALSR が保守モードで動作2
... ALSR が完全に機能して動作
7.2.5. NXビット
NXビットはCPUの機能で保護されたメモリ領域からの実行を防ぐことができるもの。
この機能の利用により実行可能なメモリ空間を制限することできる。そのため悪意のあるプログラムによる任意のコードの実行が困難にすることが可能。
NXビットは CPUレベルの機能であるため、CPU 情報を確認して確認する必要がある。
7.2.6. Exec-Shield
Exec-ShieldはNXビットの機能のない CPU をサポートするように設計された、同じ問題に対するソフトウェア手法のこと。 NXビットと同様に保護されたメモリ領域からの実行を防ぐことができる。
7.2.7. ICMPのセキュリティ設定
ICMPの無効化はカーネルパラメータのnet.ipv4.icmp_echo_ignore_all=1
で設定ができる。
このICMPの無効化はICMP(ping)応答の無効化やDDoSの軽減などホストの稼働状況に関する情報漏洩を防ぐことができる。
なお、ICMPエコーブロードキャストのみ無効化させる場合はnet.ipv4.icmp_echo_ignore_broadcasts=1
で可能。
7.2.8. SSH認証局
SSH公開鍵認証の問題
SSH 接続が初めて確立されると、SSH サーバーは自分自身を識別するための公開キーをユーザーに送信する。この認証スキームは「初回使用時の信頼」または TOFU と呼ばれる。
この認証スキームはホストのIP、名前、または公開キーが変更されると、ユーザ側にホストが信頼できないようなメッセージが表示される。
SSH CAベースの認証
SSHの認証で認証局を使用してサーバーとクライアントを認証する機能を利用するとクライアントに対してホストを認証でき、ホストの信頼性を検証できないという混乱を招くSSH公開鍵認証の問題を回避できる。
この構成を行い場合、接続先ホストとクライアントの2台だけではなく、認証局用のCAサーバが必要となる。
7.2.9. Chroot環境
chrootは特定のユーザーおよびプロセスに対して設定される疑似的なルートファイルシステムのこと。 特徴は以下の通り。
- 特権のないプロセスは、chroot 環境外のファイルにアクセスできない
- chroot 環境ではハードリンクできないため、ファイル自体をコピーして配置しておく必要がある
最新のプロセス分離ではChroot環境ではなく、仮想化やコンテナが使用される。
7.2.10. Spectre/Meltdown脆弱性
Spectre/Meltdown脆弱性はプロセッサまたは CPU のハードウェアの脆弱性のこと。 この脆弱性は発見されてはいるが、悪用するには非常に難しいとされている。 具体的にはIntel製のプロセッサに対する脆弱性で内容は以下の通り。
- Spectre脆弱性
- コンピュータにインストールされているアプリケーション間の分離が破壊されるもの
- 攻撃者は安全性の低いアプリケーションをだまして、オペレーティング システムのカーネル モジュールから他の安全なアプリケーションに関する情報を朗詠させられる
- Meltdown脆弱性
- ユーザー、アプリケーション、オペレーティング システム間の分離を破壊するもの
- 攻撃者は、そのプログラムや他のプログラムのメモリ位置にアクセスし、システムから機密情報を取得するプログラムを作成することができる
Linux マシンに Meltdown と Spectre に対するパッチが適用されているかどうかを確認するには以下プロジェクトのソフトウェアで可能。
cd spectre-meltdown-checker
chmod u+x spectre-meltdown-checker.sh
./spectre-meltdown-checker.sh
7.2.11. Polkit
PolKitは特権のないユーザセッションと特権のあるシステムとの間のネゴシエーターとして機能するアプリケーションのこと。 内部的にはユーザセッションのプロセスがシステムコンテキストでアクションを実行しようとするたびにPolkitがクエリされる。
Polkitの動作はsudo
などの従来の権限承認プログラムとは異なり、rootセッション全体に権限を付与するのではなく、特定のアクションにのみ権限を付与する。
7.2.12. Grubの制御
GRUB はパスワード機能を提供し、管理者だけが対話型操作を開始できるようにすべきものといえる。 これはGrubが構成を変更したり、実行時に任意のコマンドを実行したりできる機能があるためユーザレベルの制御としては強すぎるためである。
7.2. ホストへの侵入検知
7.2.1. スレッド検出ツール
Linuxの脅威検出ツールには以下のようなものがある。
- AIDE ... ホストの改ざん・侵入検知ツール
- OPENScap ... システム監視用のRedHat系向けのツール
- Linux Malware Detect(LMD) ... 悪意のあるソフトウェアを検出するための別のツール
- Rkhunter ... ルートキットを検知/駆除ツール
- Chkrootkit ... ルートキットを検知/駆除ツール
7.2.2. AIDE
AIDEはLinux向けのファイルとディレクトリの整合性をチェックする強力なOSS侵入検知ツール。 AIDE はファイルとディレクトリの整合性をチェックするための独自のデータベースを持つ。そのファイル署名のデータベースを維持し、ファイル署名を定期的に検証する。
またAIDEは、最近変更または変更されたファイルの監視に役立つ。誰かがファイルやディレクトリを修正または変更しようとしたときに、それらを追跡できるようになっている。
/etc/aide.conf
AIDEの設定ファイルは/etc/aide.conf
であり、検査対象と検査内容を設定できる。
検査ルール | 意味 |
---|---|
p | パーティション |
ftype | ファイル種別 |
i | inode番号 |
l | リンク名 |
n | リンク数 |
u | ユーザ |
g | グループ |
s | ファイルサイズ |
b | ブロック数 |
m | 最終更新時刻 |
a | 最終アクセス時刻 |
c | 最終ステータス更新時刻 |
S | サイズの増分 |
I inode番号の変更は無視 | |
acl | アクセスコントロールリスト |
selinux | SELinuxのコンテキスト |
xattrs | 拡張ファイル属性 |
md5 | チェックサム(MD5) |
sha256 | チェックサム(SHA256) |
ディレクトリ/ファイルのルール | 説明 |
---|---|
!<ターゲット> | 指定したファイル/ディレクトリを検査しない |
=<ターゲット> | 指定したファイル/ディレクトリを検査する(下層ファイル含まず) |
<ターゲット> <ルール> | 指定したファイルやディレクトリは以下ヘルール適用 |
aideコマンド
aideの設定
システムに AIDE を実装するには、データベースを初期化する必要がある。
データベースは/var/lib/aide
ディレクトリに作成される。
7.2.3. OpenSCAP
OpenSCAPはSCAPのOSSで拡張構成チェックリスト記述形式(XDDCF)を利用する脆弱性/セキュリティ設定監査ツールのこと。 このツールではシステムのセキュリティ対策の設定や、脆弱性対策をどこまで行っているかなどを診断・HTMLファイルとしてレポートすることができる。
なおOpenSCAPは自動化のための言語OVAL(Open Vulnerability and Assessment Language)とセキュリティ設定のチェックリストのフォーマットであるXCCDF(The Extensible Configuration Checklist Description Format)などに対応している。
7.2.4. Maldet
MaldetはLinux Malware Detect(LMD)とも呼ばれる、マルウェア検出ツールのこと。 以下のような特徴を持つ。
- 脅威を迅速に識別するためのMD5ファイルハッシュ検出
- ClamAV(アンチウイルスソフトウェア)をスキャナエンジンとして統合
- シグネチャ(マルウェア検体が持つバイトデータ)のアップデート機能
- 脅威を安全に隔離・保存、脅威を取り除いた隔離ファイルの復元
- マルウェアが挿入された文字列の削除を試行
- cronによる日次のスキャン
標準ではインストールパッケージにcronスクリプトが含まれており、定期的にスキャンおよびシグネチャのアップデートが動作するよう設定されている。
動作設定は/etc/maldetect/conf.maldet
で行う。
maldetコマンド
7.2.5. ルートキットの検出
ルートキットはコンピュータへ侵入した後に、その活動や存在を隠蔽するためにシステムを改変し、侵入の形跡を隠滅してしまうソフトウェアのこと。
chkrootkit
chkrootkit セキュリティスキャナは、システムが「ルートキット」に感染している兆候を検索できる。なおchkrootkitはrootkitを検出しても自動的に対処してくれるわけではないため、検出後は手動で処理する必要がある。
rkhunter
rkhunterはルートキット検知ツールで、マルウェア対策ソフトのように、定義データベースをアップデートすることで最新のrootkitに対応することができる。
設定ファイルは/etc/rkhunter.conf
となる。
7.2.6. Auditdによるシステム監査
ログ監査システムはシステムによって保存場所やソフトウェアが異なる。 以下は通常のOS以上のログファイルを扱うプログラムである。
- syslog ...
/var/log
にログを保存 - systemd-journald
LinuxのOSシステム監査にはAuditシステムが使用される。 auditdというデーモンによって、ファイルアクセスやシステムコールの監視、ユーザの特定の操作、セキュリティイベントの記録、ネットワークアクセスの監視など、様々なイベントを監視することができる。
監査の構成と記録
Auditにおいて、監査のログ(Auditログ)や監査のルールを設定するには以下のファイルやauditctl
コマンドを用いる。
/etc/audit/auditd.conf
... Auditログ全般の設定(ログファイルやローテーションの頻度など)/etc/audit/audit.rules
... Auditルールを設定(永続的な設定)auditctl
コマンド ... Auditルールを設定(一時的)
なお、これらルールによる監査の結果は、デフォルトでは/var/log/audit/audit.log
へ出力される。
Auditルール
audit.rules
やauditctl
コマンドで設定するAuditルールには、以下の3つがある。
- 制御ルール ... Auditルールの動作設定
- システムコールルール ... システムコールの呼び出し
- ファイルシステムルール ... 特定ファイル/ディクトリへのアクセス
auditctlコマンド
auditctlはAuditシステムのカーネルコンポーネントを制御し、Auditシステムの設定やパラメータ設定が行えるコマンド。
auditctl <オプション>
# ファイルシステムルールの設定オプション
audtictl -w <パス> -p <パーミッション> -k <キーワード>
# システムコールルールの設定ぷしょん
auditctl -a <リスト,アクション> -S <システムコール名> -F <フィールド> -k <キーワード>
制御ルールのオプション | 説明 |
---|---|
-b <値> | Auditバッファの最大値 |
-e [0,1,2] | 監査設定(0:無効,1:有効,2:ロック) |
-f [0,1,2] | 深刻なエラー時の挙動(0:何もなし,1:printkへ出力,2:カーネルパニック) |
-r <メッセージ数> | 1秒あたりのメッセージ上限 |
-D | 全ルールの削除 |
-l | 現在の設定のリスト表示 |
-s | Auditシステムのステータス表示 |
ファイルシステムルールに関するオプション | 説明 |
---|---|
-w <パス> | 監査対象のファイル/ディレクトリ |
-p <パーミッション> | ログに記録するパーミッション設定(r:読み取り,w:書き込み,x:実行, a:属性変更) |
-k <キーワード> | ログエントリ参照時のキーワード |
システムコールに関するオプション | 説明 |
---|---|
-a [リスト, アクションリスト] | リストおよびアクションの追加 |
-d <リスト,アクション> | リスト/アクションの削除 |
-S <システムコール名> | システムコール名または番号(全監視はall) |
-F |
アーキテクチャ/ユーザIDの条件に基づいてイベント照合する際の追加オプションを指定 |
-k <キーワード> | ログエントリ参照時のキーワード |
システムコールルールのアクション | 説明 |
---|---|
always | 常に監査ログを記録 |
never | 監査ログの作成を行わない |
システムコールルールのリスト | 説明 |
---|---|
exclude | 特定イベントの除外 |
exit | システムコールの終了時 |
task | プロセス生成,プロセスコピー時 |
user | アプリケーションイベントの対象にする |
なお、システムコールの番号はusr/include/asm/unisted_64.h
の参照、またはausyscall
コマンドにより調べることができる。
その他のAuditユーティリティ
# Auditログファイル内のイベント検索
ausearch
# Auditログファイルに記録されたイベントについてサマリー/レポートの作成
aureport
# プログラム終了までシステム コールとプロセスを追跡できるコマンド
autrace
TTY入力の監視
各ユーザのTTY入力の監視の有効化はpam_tty_audit.so
の設定を行う。
この設定によりユーザがどのコマンドを実行したかログに記録できる。
監査の有効化は/etc/pam.d/password-auth
と/etc/pam.d/system-auth
陛下のように定義する。
なお、結果はaureport --tty
で参照できる。
7.3. リソース制御
LinuxOSにはユーザが使用できるシステムリソース量を制限できる機能があり、制限にはulimit
コマンドを用いる。
7.3.1. ulimitコマンド
シェルやシェルにより開始されるプロセスが使用できるリソースを制限できるコマンド。
/etc/security/limits.conf
再起動時にulimitの設定を維持するには、/etc/security/limits.conf
でシステム全体に制限をかける必要がある。
なお制限方法は以下の2種類がある。
- ソフトリミット ... 現在有効なユーザーの利用可能なリソースの制限
- ハードリミット ... 実際の最大制限
7.3.2. pam_limits.so
pam_limits.so
モジュールはユーザセッションで取得できるシステムリソースに制限を設定できるもの。
なおuid=0のユーザも影響を受ける。
またデフォルトに制限は構成ファイル/etc/security/limits.conf
、次にディレクトリ/etc/security/limit.d
の各ファイルが読み取られる。
7.3.3. Cgroup
CgroupはRedHat系の機能でシステム上で実行されているユーザー定義のタスク (プロセス) グループ間で、CPU 時間、システム、メモリ、ネットワーク帯域幅、またはこれらのリソースの組み合わせなどのリソースを割り当てることができる仕組みのこと。
一言で言うとカーネル内の特定のサブシステムを制御するためのメカニズムといえる。
Cgroups V1(RHEL8以前)の仕組み
CgroupsはKubernetes、Docker等のコンテナ技術でも使用されている。
Cgroupにおいてデバイス、CPU,メモリ(RAM)、ネットワークアクセスなどのサブシステムはコントローラ
と呼ぶ。
コントローラのタイプ(Cpu,blkio,memoryなど)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。
cgroup はリソースタイプごとに作成され、相互に関連付けはない。 つまり、すべてのコントローラにグループを関連付けることはできるが、グループは独立して扱われる。
/proc/cgroups
コンピュータ上で有効なコントロールグループが確認できる。
/sys/fs/group
sysfs経由でも確認できる。
コントロールグループに関する情報の取得
systemd-cgls
コマンドで制御グループの階層を表示ができる。
systemd-cgtop
コマンドではのリソース消費をリアルタイムで監視できる。