コンテンツにスキップ

7. ホストのセキュリティ

7.1. ホストセキュリティの強化

7.1.1. カーネルセキュリティ

不要なソフトウェアを無効化

実行中のすべてのプログラムには、セキュリティ上の脅威が存在する可能性があるため、使用されていないサービスを無効にすることは、セキュリティ上の良い設定となる。

サービスの無効化にはsystemctlおよびchkconfigを使用することで可能。 一般的に無効化するサービスには、atd、ava hi-daemon、cups がある。

リソース使用量の制限

ユーザーはスレッド、開いているファイル、メモリなどのシステムリソースを制限することができる。

paml_limits.soモジュールを使用すると、オペレーターはハード制限およびソフト制限を通じてユーザーがアクセスできる 1 つのリソースの量を制御できる。

ulimitコマンドでもユーザーがアクセスできるリソース量を制限可能。 また恒久的な設定は/etc/security/limits.confで可能。

ulimit <オプション> 
オプション 説明
-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で他のユーザの実行中のプロセスを確認できる。

cat /proc/1234/status | grep Cap
cat /proc/$$/status | grep Cap

上記コマンドで表示される各行は以下内容を意味する。

  • CapInh ... 継承された機能
  • CapPrm ... 許可される機能
  • CapEff ... 有効な能力
  • CapBnd ... 境界セット
  • CapAmb ... アンビエント機能セット

また、実行中のプロセスの機能を確認するには、getpcapsツールの後にプロセス ID (PID) を続けて使用することでできる。

バイナリ機能

バイナリには、実行中に使用できる機能を含めることができる。 たとえば、cap_net_rawのような機能をping持つバイナリを見つけるのは非常に一般的となる。

getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

バイナリ検索はgetcap -r / 2>/dev/nullで行える。

capsh による機能の削除

pingのCAP_NET_RAW機能を削除すると、ping ユーティリティは機能しなくなる。

capsh --drop=cap_net_raw --print -- -c "tcpdump"

バイナリ機能の削除

バイナリの機能を削除するには以下コマンドで行える。

setcap -r </path/to/binary>

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 情報を確認して確認する必要がある。

grep -Fw nx /proc/cpuinfo

7.2.6. Exec-Shield

Exec-ShieldはNXビットの機能のない CPU をサポートするように設計された、同じ問題に対するソフトウェア手法のこと。 NXビットと同様に保護されたメモリ領域からの実行を防ぐことができる。

7.2.7. ICMPのセキュリティ設定

ICMPの無効化はカーネルパラメータのnet.ipv4.icmp_echo_ignore_all=1で設定ができる。

sysctl -w 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 に対するパッチが適用されているかどうかを確認するには以下プロジェクトのソフトウェアで可能。

git clone https://github.com/speed47/spectre-meltdown-checker.git
  1. cd spectre-meltdown-checker
  2. chmod u+x spectre-meltdown-checker.sh
  3. ./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であり、検査対象と検査内容を設定できる。

# 記述例
CONTENT_EX = sha256+ftype+p+u+g+n+acl+selinux+xattrs
検査ルール 意味
p パーティション
ftype ファイル種別
i inode番号
l リンク名
n リンク数
u ユーザ
g グループ
s ファイルサイズ
b ブロック数
m 最終更新時刻
a 最終アクセス時刻
c 最終ステータス更新時刻
S サイズの増分
I inode番号の変更は無視
acl アクセスコントロールリスト
selinux SELinuxのコンテキスト
xattrs 拡張ファイル属性
md5 チェックサム(MD5)
sha256 チェックサム(SHA256)
# 設定例
/boot/ CONTENT_EX # ルールの適用

!/etc/.*~ # etc以下の「.」ファイルは無視
=/var/log # /var/log以下のチェック
ディレクトリ/ファイルのルール 説明
!<ターゲット> 指定したファイル/ディレクトリを検査しない
=<ターゲット> 指定したファイル/ディレクトリを検査する(下層ファイル含まず)
<ターゲット> <ルール> 指定したファイルやディレクトリは以下ヘルール適用

aideコマンド

# データベースの初期化
aide --init

# データベースのチェック
aide --check

# データベースの更新
aide --update

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コマンド

# スキャン
maldet -a
maldet --scan-all <ディレクトリ>

# レポート
maldet -e

7.2.5. ルートキットの検出

ルートキットはコンピュータへ侵入した後に、その活動や存在を隠蔽するためにシステムを改変し、侵入の形跡を隠滅してしまうソフトウェアのこと

chkrootkit

chkrootkit セキュリティスキャナは、システムが「ルートキット」に感染している兆候を検索できる。なおchkrootkitはrootkitを検出しても自動的に対処してくれるわけではないため、検出後は手動で処理する必要がある。

# ルートキットのチェック
chkrootkit

# ルートキットのチェック(冗長出力OFF)
chkrootkit -q

rkhunter

rkhunterはルートキット検知ツールで、マルウェア対策ソフトのように、定義データベースをアップデートすることで最新のrootkitに対応することができる。 設定ファイルは/etc/rkhunter.confとなる。

# 更新
rkhunter --update

# 保持されたデータファイルを現在値で更新
rkhunter --propupd

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.rulesauditctlコマンドで設定する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陛下のように定義する。

# rootのみ、TTY入力の監査を有効にする
session required pam_tty_audit.so diable=* enable=root

なお、結果はaureport --ttyで参照できる。

7.3. リソース制御

LinuxOSにはユーザが使用できるシステムリソース量を制限できる機能があり、制限にはulimitコマンドを用いる。

7.3.1. ulimitコマンド

シェルやシェルにより開始されるプロセスが使用できるリソースを制限できるコマンド。

ulimit -a

/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など)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。

Cgropus

cgroup はリソースタイプごとに作成され、相互に関連付けはない。 つまり、すべてのコントローラにグループを関連付けることはできるが、グループは独立して扱われる

/proc/cgroups

コンピュータ上で有効なコントロールグループが確認できる。

cat /proc/cgroups

/sys/fs/group

sysfs経由でも確認できる。

ls -l  /sys/fs/group

コントロールグループに関する情報の取得

systemd-cglsコマンドで制御グループの階層を表示ができるsystemd-cgtopコマンドではのリソース消費をリアルタイムで監視できる

systemd-cgls

systemd-cgtop