久しぶりの投稿となりますが、完全に自分用のメモです。
LPIC 303 – Security を受験する前の走り書きとなります。 試験範囲は、(Linux上でも)よく利用されるセキュリティ関連のツールと概念が対象です。
脅威と脆弱性診断
Penetration Testing: 実際に攻撃された場合にどのような影響を受けるのかを検証するテスト手法。 実際の攻撃をシュミレーションするため、被検査組織の責任者に許可を得ておかなければならない。(不正アクセス禁止法に抵触する恐れ)
ペンテストの6つのステージ:
- Reconnaissance: 偵察
- Scanning: スキャン
- Vulnerability Assessment: 脆弱性評価
- Exploitation: 攻撃
- Reporting: レポート作成
Metasploit(または、Metasploit Framework): 攻撃者の侵入手法をシミュレーションするフレームワーク。 防御や攻撃内容の分析ツールではない。 GUIで操作するインターフェースに Armitage と呼ばれるソフトウェアがある。
nmap コマンドオプション:
- -sS: TCP SYNスキャン、rootユーザの場合のデフォルト
- -sT: TCP connect()スキャン、一般ユーザの場合のデフォルトかつ唯一実行可能なタイプ
- -O: OSの種類のスキャン
- -iL : スキャンターゲットのファイルからの読み込み
- -p : スキャンするポートの指定(ハイフンで範囲指定可能)
NSE(Nmap Scripting Engine): nmapの拡張機能。 より詳細なスキャンや、サービスやアプリケーションを指定したスキャン用スクリプトを実行する。
root権限で nmap コマンドを実行した場合には、TCP SYNスキャン(ステルススキャン)が実行される。
ルートキット(rootkit)は、コンピュータへ侵入した後に、侵入の証拠を隠蔽するためのソフトウェア。 ログの改ざんや消去などが主な動作。
中間者攻撃(Man-in-the-Middle:MITM attack):
通信経路の間に割り込み、攻撃者の端末を経由させることで、データの盗聴や改ざんを行う攻撃。 ネットワーク上の機器やサーバ等偽装するスプーフィング(spoofing)などがそれにあたる。
スプーフィングには以下のようなものがある:
- DNSスプーフィング
- ARPスプーフィング(IPv4)
- NDPスプーフィング(IPv6)
- IPスプーフィング
- DHCPスプーフィング
AIDE(Advanced Intrusion Detection Environment): 侵入検知システムである IDS の実装の一種。 オープンソースで開発されており、ホストへの侵入検知やファイルの改竄などを検出できる。
Kali Linux: Debian系のLinuxディストリビューションの一種。 ペネトレーションテスト用のツールが標準でインストールされている。
DNSのセキュリティ
DANE(DNS-based Authentication of Named Entities): DNSSECを応用した認証の仕組み。 HTTPSの認証の仕組みをDNSに持たせ、TLSAレコードが使われている。
TLSAレコードの形式:
_<PORT>._<PROTOCOL>.<DESTINATION>
TLSAレコードは openssl s_clientコマンドで検証することができる。
mDNS: マルチキャストDNSのことで、ローカルネットワーク内で、DNSサーバを使わずホスト名の解決を行うことができる。 通常はポート番号 5353 を利用する。
DNSサーバとクライアントとの間で通信は、通常は暗号化されていなため、盗聴や改ざんのリスクがある。 このリスクを軽減するための技術として DNS over TLS(DoT) や DNS over HTTPS(DoH) がある。
DNS over TLS(DoT): TLSを使用して通信を暗号化する、デフォルトではポート 853 を使用する。
DNS over HTTPS(DoH): HTTPSを使用して通信を暗号化する。 DNSクエリが他のHTTPS通信に紛れ込み、攻撃されにくくなる。 基本はポート 443 を使用。
CAA: Certification Authority Authorization とは、DNS利用時にドメインの所有者が特定の認証局(CA)だけにサーバ証明書の発行を許可する仕組み。 DNSに登録されたCAAレコードを認証局が確認した上で証明書が発行される。
DNSSEC(DNS SECurity Extensions): 悪意のある第三者が、DNSの応答を不正操作することは、DNS自体の仕様的に可能である。 この不正操作の対策として、DNSの応答の正当性を確保するための仕組み(DNSSEC)が考案された。 正当性の確認は電子署名によって行われる。
BINDサーバでDNSSECを利用するためには、設定ファイル “/etc/named.conf” のoptionsセクションに以下2つの項目を設定する:
- dnssec-enable yes;
- dnssec-validation auto;
dnssec-enable -> DNSSEC自体の有効/無効の設定
dnssec-validation -> DNSSEC自体が有効になっている前提で、DNSSEC検証の有効/無効の設定
BINDサーバでクライアント側にBINDのバージョンを表示させないようにするには、設定ファイル “/etc/named.conf” のoptionsセクションに次の項目を設定する:
- version “”;
DNSSECで使用されるリソースレコード:
- DS(Delegation Signer): KSK公開鍵のハッシュ値を含む情報。 キャッシュサーバで検証される
- DNSKEY(DNS Key Record): KSK・ZSKの公開鍵の情報。 キャッシュサーバが署名の検証の際に利用する公開鍵
- RRSIG(Resource Record Digital Signature): 各リソースレコードのデジタル署名。 権威サーバからの応答の正当性を検証するために利用される。
- NSEC(Next-Secure Record): 存在していないゾーンについて問い合わせがあった場合に、そのゾーンを管理する権威ネームサーバが、不存在との旨の回答に署名するためのリソースレコード。 ゾーンの問い合わせに対し、辞書順で次に存在するゾーンを返す。
- NSEC3(NSEC Record Version3): NSECの改良版。 辞書順で次に存在するゾーンを返すのではなく、それをハッシュ化した値を返す。 Zone Enumeration というゾーン情報のスキャンを防止できる。
- NSEC3PARAM(NSEC3 parameters): NSEC3を生成する際に権威サーバが使用するパラメータ
- TLSA(TLS Association): DANE で利用されるレコード。 ドメイン名とX.509証明書の情報が紐づいている。
元々、ゾーン情報への署名が必要になる場合、dnssec-signzone コマンドを用いる必要があったが、BIND9.9以降は、DNSSECが有効化された環境で、ゾーン情報のセクションに以下2項目を設定することで鍵の管理とゾーンへの署名を自動化することができる。 つまり、署名されたゾーン情報のファイルがBINDにより自動生成される:
- inline-signing yes;
- auto-dnssec maintain;
dnssec-settime コマンド: キータイミングのメタデータを設定・表示する。
dnssec-signzone コマンド: ゾーンファイルへの署名を実施。 NSEC, NSEC3, RRSIG, DNSKEY などのレコードが生成される。
dnssec-keygen コマンド: ZSKおよびKSKを生成する
ホストのセキュリティ
CPUアーキテクチャに関わる脆弱性:
- Spectre: 条件分岐において、分岐を仮定して先行で読み込む機能(投機的実行: Speculative Execution) を利用した脆弱性。 本来は参照できない領域のデータを読み取られてしまう。
- Meltdown: 処理が未完了であっても次の処理を実行する機能(アウトオブオーダー実行: out-of-order execution) を利用した脆弱性。 意図せず別のプロセスからデータを読み込まれてしまう。
Spectre や Meltdown といった、CPUアーキテクチャの脆弱性は、処理の高速化のための機能を利用しているため、対策を行う場合にはパフォーマンスとの兼ね合いが出てくる。
Capability: ルート権限を機能ごとに分割して管理できるようにした機能のこと。 細かな権限の設定が可能となる。
getcap コマンド: ファイル名を指定して設定されているケーパビリティを表示する
setcap コマンド: 指定したファイルに指定したケーパビリティを設定する
- -r: ケーパビリティの削除
capsh コマンド: 指定したケーパビリティでコマンドやシェルを実行する
バッファオーバーフロー攻撃への防御:
- ASLR(Address Space Layout Randomization): メモリ内のデータレイアウトのアドレスをランダム化する。
- Exec-Shield: データ領域など、特定のメモリ領域からは命令を実行できなくする。
- DEP(Data Execution Prevention): Exec-Shield と同様のメモリ保護機能として、Windowsで実装されている。
USBGuardの設定ファイル:
- /etc/usbguard/usbguard-daemon.conf: usbguard-daemon 自体の動作設定
- /etc/usbguard/rules.conf: ルールセットの設定
auditctlは、 Auditシステムの設定やパラメータの制御を行うコマンドラインツールで、そのコマンドオプションには次の3つのタイプがある:
- 制御ルール関連
- ファイルシステムルール関連
- システムコールルール関連
auditctl コマンドオプション:
- -b: Audit バッファの最大値の指定
- -e: 監査の有効化。 0 -> 無効、1 -> 有効、2 -> ロック
- -w: 監査対象のパスを指定
- -k: ログエントリ参照時のキーワードを指定
- -p: ログに記録する対象動作(パーミッション)の指定
- -d: システムコールルールを削除
- -r: 1秒あたりのメッセージ数の上限を指定
- -f: 深刻なエラーが発生した際の挙動を設定
auditctl 以外のユーティリティ:
- ausearch -> Auditログファイル内のイベントを検索
- ・aureport -> Auditログファイルに記録されたイベントのサマリとレポートを生成
aureport –summary で、Auditログのサマリを生成する。
Linuxの監査システムは、セキュリティ上の問題点や脅威と思われるものを、ポリシーに基づいてホストのログから拾い上げ把握できるようにすることが役割。 拡張版ログのようなイメージ。 auditd というデーモンによってLinuxの監査が行われ、ファイルアクセスやシステムコールの監視、ユーザの特定の操作、セキュリティイベントの記録、ネットワークアクセスの監視など、様々なイベントを監視することができる。
Auditログは、デフォルトでは “/var/log/audit/audit.log” に出力される。
Auditにおいて、監査のログ(Auditログ)や監査のルールを設定する方法は主に以下:
- /etc/audit/audit.conf -> Auditログ全般の設定
- /etc/audit/audit.rules -> Auditルールを永続的に設定
- auditctl -> Auditルールを一時的に設定
pam_tty_audit.so: Audit システム上で、ユーザによるTTYへの入力の監査を有効にするためのモジュール
seaudit-report コマンド: 監査ログのSELinux用カスタムレポートを作成する
LMD: Linux Malware Detect とは、Linuxのマルウェア検出ツールのことで、各種操作を行うためのインタフェースには maldet コマンドが利用される。 インストールパッケージに cron スクリプトが含まれ、定期的なスキャンとシグネチャのアップデートが実行される。
設定ファイルは、 /etc/maldetect/conf.maldet に保存される。
LMD は、マルウェア検出エンジンにオープンソースのアンチウイルスソフトウェアである ClamAV を採用。
Polkit: 特権を持たないプロセスが、特権を持つプロセスと通信し、必要な権限を得て操作を実行するための手段を提供する。 一般ユーザがsudoやsuコマンドを使ってルート権限を得るのと似ているが、もっと細かい制御が可能。
sysctl コマンドオプション:
- -a | -A: 設定可能なカーネルパラメータとその値の表示
- -n: 指定したカーネルパラメータの値を表示
- -w: 指定したカーネルパラメータに値を設定 -> “key=value”
- -p: ファイルから設定を読み込む。 設定の反映にも使用できる。 指定がない場合、デフォルトで /etc/sysctl.conf が読み込まれる
cgroup: Control Group の略。 プロセスをグループ化し、そのグループ内に存在するプロセスに対して機能ごとに管理することが可能となる。 例えば、ホストOSが持つCPUやメモリなどのリソースに対して、グループごとに制限をかける、といった管理など。 この分割された機能のことを、サブシステムやコントローラと呼ぶ。 主なコントローラ(サブシステム)は以下。
- cpu: CPU時間のスケジューリング
- cpuset: CPU自体やメモリの割り当て
- blkio: ブロックデバイスのI/Oアクセス制御と監視
- devices: デバイスへのアクセス制御
- net_cls: cgroup から発信されるパケットにタグをつけて制御する
- net_prio: ネットワークトラフィックの優先度を制御
- freezer: プロセスの一時停止や再開を制御
- memory: メモリリソースのレポートや使用量の制限
systemd-cgtop コマンドで、スライスやサービスのリソース使用量を表示することができる。 インタフェースや操作はtop コマンドと同様。
systemd-cgls コマンドで、cgroup のリソースを階層構造で表示する。
利用可能なcgroupのコントローラ(サブシステム)の一覧確認:
cat /proc/cgroups
systemctl set-property コマンドを使用してリソース制限をした場合、内部的には、制限内容が設定されたドロップインファイルが作成される。
systemctl set-property httpd MemoryLimit=100M
上記のコマンド実行により、 /etc/systemd/system/httpd.service.d/ ディレクトリに <任意の名称>.conf が作成される。
grub2-mkpasswd-pbkdf2 コマンド: GRUB の、パスワードをハッシュ化する。
※ Password-Based Key Derivation Function 2 は、鍵導出関数で、総当たり攻撃に対する脆弱性を軽減することを目的として使用される。
SCAP(Security Content Automation Protocol): NIST(National Institute of Standards and Technology)による情報セキュリティ関連の標準規格で、セキュリティ対応を自動化・標準化するためのフォーマットが定義されている。 OpenSCAPは、SCAPのオープンソースプロジェクト。
OpenSCAPでは、システムのセキュリティ対策の設定や、脆弱性対策のレベルの診断、HTML形式のレポートの出力などが可能。
X.509証明書
SSLサーバ証明書の類型:
- DV(Domain Validation): ドメイン名の所有者である証明
- OV(Organization Validation): DVと、組織が法的に存在する証明
- EV(Extended Validation): DV + OV と、組織が物理的に存在する証明
ACME(Automatic Certificate Management Environment): 証明書管理を自動化するプロトコル。 Certbot などのソフトウェアが利用する。
Let’s Encrypt: X.509証明書を無料で発行している認証局。 DVタイプのサーバ証明書のみが対象となる。
SSLの主な実装には、OpenSSLとCFSSLがあり。 どちらもオープンソース。
openssl genrsa コマンドで利用できる暗号化方式には主に以下の3つがある:
- DES: Data Encryption Standard
- TripleDES
- IDEA: International Data Encryption Algorithm
X.509証明書は、信頼できるものが署名したものは信頼の連鎖に加えられることを前提にしたモデルで運用される。 これを、トラストチェーンという。 英語だと Chain of trust
openssl ca コマンドで、プライベート認証局によってCSRへ署名を行いサーバ証明書を発行する:
openssl ca -keyfile <CA秘密鍵> -out <サーバ証明書> -infiles <CSR>
openssl rsa コマンドで、DES方式で暗号化された秘密鍵 server.key をテキスト形式で表示:
openssl rsa -des -in server.key -text
openssl rsa コマンドで、秘密鍵から公開鍵を生成する:
openssl rsa -in <秘密鍵> -pubout -out <公開鍵>
openssl genrsa コマンドで、1024bitの秘密鍵を生成する:
openssl genrsa -out server.key 1024
openssl req コマンドで、CSRを作成せずにサーバ証明書を自己署名で作成する:
openssl req -new -x509 -key <サーバ秘密鍵> -out <サーバ証明書> -days 365
openssl req コマンドで秘密鍵を使用してCSRを新規作成する:
openssl req -new -key <サーバ秘密鍵> -out <CSR名>
openssl のサブコマンド:
- ca: 認証局の管理
- x509: X.509証明書の管理
- rsa: RSA暗号の鍵の管理
- req: CSRの管理
DER(Distinguished Encoding Rules): X.509証明書のエンコード形式の一種で、バイナリ形式のデータ。 ASN.1(Abstract Syntax Notation One) に基づく
PEM(Privacy-Enhanced Mail): X.509証明書または鍵の base64エンコード形式。 証明書もしくは鍵を単独またはまとめて保存できる
PKCS(Public-Key Cryptography Standards): RSA Security社によって策定された公開鍵暗号技術の規格群。 データ形式やプロトコルなどの技術仕様を定める。 PCKS#1からPCKS#15までが公表されている。
秘密鍵については秘匿性が重要だが、公開鍵は真正性(公開鍵の所有者が意図したものであること)が重要。 また、RSA の秘密鍵から公開鍵を生成することができる。
X.509証明書による暗号化・署名・認証
OCSP(Online Certificate Status Protocol): 公開鍵の証明書の失効状態を取得する通信プロトコル。
OCSP stapling: OCSPの拡張仕様で、クライアント側ではなく、サーバー側が認証局のOCSPレスポンダーに問合せを行い、証明書とともにブラウザなどのクライアントに提示する仕組み。
まず、Netscape社により SSL が開発され、後に TLS として IETF: Internet Engineering Task Force によってRFC化された。 名称としては、 SSL/TLS と呼ばれることが多い。
HSTS(HTTP Strict Transport Security): HTTPSへの初回リダイレクト時に懸念される中間者攻撃への対策。 一度HTTPSでアクセスしたサイトがHSTSを強制するようクライアントに指示した場合、以後一定の有効期間内はクライアント側からはHTTPSで通信を行うようになる。 つまり、HSTSを設定すると、URL入力時に意図的に http:// を指示しても、ブラウザはHTTPS接続を行う。
HSTSを有効にすることで、最初のHTTPアクセスから攻撃者がユーザーのCookieを傍受し個人情情報を収集したり、フィッシングサイトへリダイレクトしたりする、といったセキュリティ上のリスクを排除できる。
openssl s_client コマンドオプション:
- -connect: サーバとホストを指定してSSL/TLS接続
- -showcerts: 全てのSSL証明書を表示する。 作成した証明書の認証チェインの確認
- -starttls: 指定したプロトコルによる、STARTTLS接続を行う
- -servername: SNI(Server Name Indicator) 対応のサーバで、接続するドメイン名を指定する
STARTTLS: 専用のポート番号を割り当てずに、途中から平文の通信を暗号化通信に切り替える通信プロトコル拡張の一種。
openssl コマンドでサーバ証明書とサーバ秘密鍵を指定し、正常に作動するか確認する:
openssl s_server -cert server.crt -key server.key
SSLはNetscape社が開発し普及しましたが、TLSとしてIETF(Internet Engineering Task Force:インターネット技術の標準を作成する団体)によってRFC化され、SSL3.0からTLSが派生しました。SSL3.1がTLS1.0に該当します。一般的名称としてはSSL/TLSと呼ばれています。
SSL(Secure Sockets Layer): 1990年代中頃、 Netscape Navigator を制作していたNetscape社で開発されたが、バージョン 1.0、2.0、3.0 と、セキュリティ上の脆弱性が存在していた。
TLS(Transport Layer Security): SSL は、IETF(Internet Engineering Task Force) へ移管され、1999年1月に SSL3.0 をベースにした TLS1.0 がリリースされ、実質SSLからTLSへと移行した。 ただし、TLS1.0 と SSL3.0 との互換性はない。
Apache バージョン2.4.8以降で、設定項目の SSLCertificateChainFile が廃止され、SSLCertificateFile に、中間CA証明書とサーバ証明書をまとめたファイルを指定する形式となった。
ファイルシステムの暗号化
LUKS(Linux Unified Key Setup): Linuxディスク暗号化の標準仕様。
cryptsetup の LUKSモードオプション:
- luksDump: LUKSパーティションの状態表示、 luksStatus のようなオプションは存在しないので注意。
- luksKillSlot: LUKSパーティションに設定したパスフレーズを削除
- luksDelKey: luksKillSlot と同様、旧コマンド
- luksAddKey: LUKSパーティションにパスフレーズを追加
- luksFormat: デバイスをLUKSパーティションとして初期化
- luksHeaderBackup: LUKSヘッダのバックアップ
- luksHeaderRestore: LUKSヘッダのリストア
cryptsetup の plainモードオプション:
- status: 暗号化マッピングの状態表示
cryptmount コマンドオプション:
- -x | –swapoff: ターゲットへのスワップを無効化
- -l | –list: 利用可能な暗号化ファイルシステムとそれらの基本情報を表示
- -c | –change-password: ターゲットのパスワードを変更
- -g | –generate-key: 復号キーの作成
cryptsetupで設定した暗号化ボリュームをOS起動時に自動的にマウントするためには、” /etc/crypttab” と “/etc/fstab” にエントリを追加する。
※ “etc/crypttab” -> “/etc/fstab” の順に読み込まれる。
eCryptfsは、ファイルごとに暗号化に関するメタデータを持ち、かつカーネルモードで動作する。
NBDE(Network Bound Disk Encryption): ネットワーク経由でディスクの暗号化と復号を行う技術。 特定のネットワーク内で起動した場合は自動復号し、外で起動した場合はパスフレーズの入力を要求とするような設定が可能。
NBDE の実装の一つに、Clevis がある。 Pin と呼ばれるプラグインにより機能を拡張できる。
Clevis の代表的なPin:
- TPM2: TPM2ポリシーを使用してディスクの暗号化を解除
- Tang: ネットワークサーバーを使用してディスクの暗号化を解除
TPM(Trusted Platform Module): マザーボード上にあるセキュリティチップで、パスワードや暗号化キー、セキュリティ証明書などをハードウェア上で管理できるようになる。 Windows11では必須要件となっている。
EncFS: FUSEベースの暗号化ファイルシステムを実装したフリーソフトウェア
FUSE(Filesystem in Userspace): 権限を持たないユーザが、カーネルコードを修正することなく独自のファイルシステムを作成できる機能を提供する。
ネットワークのセキュリティ
tcpdump コマンドオプション;
- -p: プロミスキャスモードを使用しない
- -r: パケット情報をファイルから読み込む
- -w: パケット情報をファイルに書き込む
- -i: 監視するインターフェースの指定
- -x: パケットの内容を16進数で表示
- -X: パケットの内容を16進数とASCII文字で表示
tcpdump で送信元ポートが22番のパケットを監視。
# tcpdump src port 22
※ tcpdump port src 22 とはならないので注意
tcpdump を実行すると基本的には promiscuous モードで動作する。 このモードに切り替わるのを防止するためには、 -p オプションを付与する。
Promiscuous mode: 自身のMACアドレスかどうかを問わず無差別にパケットを受信する
RADIUS(Remote Authentication Dial In User Service): 大雑把に言うと、ネットワーク上で認証を行う方法について定めたプロトコルの一種。 「RADIUSサーバ」、「RADIUSクライアント」、「ユーザ」の3つの要素からなる。
FreeRADIUS の操作用コマンド。
- radwho: クライアントへログイン中のユーザを表示
- radclient: サーバに向けて各種RADIUSプロトコルのパケットウを送信
- radmin: サーバ/クライアントの設定を表示/変更するCLI機能を提供
FreeRADIUSの設定ファイルのディレクトリ -> /etc/raddb/
- radiusd.conf: FreeRADIUS全体に関する設定
- clients.conf: FreeRADIUSのクライアント情報の設定
- uers: ユーザIDやパスワードの設定
FreeRADIUSの制御を行うデーモン名 -> radiusd
ARPパケットはブロードキャストで送信される。
Switched Network: ハブを使わず、ブリッジまたはスイッチを導入しているネットワークのこと。 MACアドレスにより、該当するノードへ向けてのみパケットが送信される。 Wireshark でパケットをキャプチャしても、自ホストに対するもののみしかキャプチャできい。
tshark コマンドオプション:
- -D: 有効なネットワークインターフェースの一覧を表示
- -z: 指定した項目の統計情報を表示
- -V: キャプチャ内容の詳細を表示
MIB: Management Information Base とは、ネットワーク管理用プロトコルのSNMPで利用可能な情報を、ツリー構造で記述したデータのこと。 また、SNMP: Simple Network Management Protocol は、ネットワーク機器やハードウェアを監視するためのプロトコル。
パケットキャプチャとスニッファリングは概ね同じような意味で使われるが、パケットキャプチャの方が、「正当な理由に基づく解析」 といったニュアンスが強い、反対にスニッファリングは 「パケット情報の悪用」のニュアンス。
ワイヤレスネットワークの解析ツール:
- Kismet: GUI操作が可能で、クロスプラットフォーム利用可能。 パケットのスニッファや監視ができる
- Aircrack-ng: パケットスニッファリングやワイヤレスセキュリティ(WEP, WPA)などに対する攻撃のシミュレーションが可能
- bettercap: bluetooth を含むワイヤレスデバイスにスキャンやクラッキングができる。 また Man-in-the-Middle attack の機能も有し、 DNSスプーフィングやARPスプーフィングなども可能である
ipset コマンドは、 IPアドレスやポート番号等をひとまとめにして管理するツール。 netfilter と共に利用することで対象となるIPアドレスやネットアドレスを一元管理できる。
ipset create のオプションには、IPv4, IPv6 それぞれに対して以下の二種類がある:
- family inet
- family inet6
ipset create のタイプには、ホストアドレス、ネットワークアドレスそれぞれに対して以下の二種類がある:
- hash:ip
- hash:net
Cacti: オープンソースで業界標準のデータロギングツールRRDtoolのためのフロントエンドアプリケーション。 Webベースでネットワーク監視およびグラフ生成が行える。 サーバ等の機器の動作状況をSNMP(Simple Network Management Protocol)を用いて監視する。
Snort: ネットワーク上のパケットを監視しする IDS(Intrusion Detection System)の一種。 設定ファイルは、デフォルトで /etc/snort/ ディレクトリに保存される。 なお、設定ファイルの変更反映には Snortプロセスの再起動が必要。
- /etc/snort/snort.conf -> Snort 本体の設定ファイル
- /etc/snort/rules/ -> 各種ルールセットが保存される
snort コマンドオプション:
- -b: ログを tcpdump 形式で記録
- -c: 設定ファイルを指定する
- -d: アプリケーション層のデータも対象とする
- -D: daemon モードで起動
- -g: 起動するグループの指定
- -u: 起動するユーザの指定
- -i: ネットワークインターフェースの指定
- -l: ログディレクトリを指定、ここでファイルではなくディレクトリであることに注意
※ 指定がない場合は、 /var/log/snort ディレクトリ
pulledpork コマンド: Snort の新しいルールセットをダウンロードして、オプション “-c” で指定した設定ファイルに書き込む。 なお、pulledport コマンド自体には、定期自動実行するためのスクリプトは付随しないため、必要であれば cron などを利用して定期更新する環境を構築する。
snort-stat コマンド: Snort が検出した情報をログから読み取り、統計情報を生成する。
cat /var/log/hoge.log | snort-stat
ntop: ネットワークトラフィック解析ツール。 送信元・送信先ごとのデータ収集が可能で、データをWebブラウザでリアルタイムに表示したり、リモートからローカルマシンのトラフィックを監視したりできる。最新バージョンでは、コマンドが “ntopng” に変更となっている。
設定ファイルは、 /etc/ntopng/ntopng.conf
ntopng コマンドで監視するネットワークインタフェースは、 ntopng.conf または ntopng コマンドに “-i” オプションで指定する。
iptables のテーブル mangle はIPヘッダに定義されているTOS(Type of Service)フィールド値を書き換える際に使用する。 TOSフィールドでは、パケット処理の優先度付けを行うことでQoS(Quality Of Service)を制御する。
iptables のルールで、否定を表す文字は “!”:
iptables -A INPUT -p tcp ! -s 127.0.0.0/8 --dport 20:22 -j DROP
iptables コマンドでパケットカウンタやバイトカウンタをゼロにする:
iptables -Z
nft コマンド: iptables、ip6tablesやebtablesなどを統合した、nftablesのユーティリティ
nft コマンドでルールセットを表示する:
nft list ruleset
ebtables で利用可能なテーブルは3つ:
- filter -> チェイン INPUT, OUTPUT, FORWARD が使用可能
- nat -> チェイン PREROUTING, OUTPUT, POSTROUTING が使用可能
- broute -> チェイン BROUTING
ebtablesコマンドで、テーブル broute へ設定したルールを、パケットおよびバイトカウンタを含めて表示する。
ebtables -t broute -L --Lc
firewall のアーキテクチャ:
- パケットフィルタリング型: レイヤ3〜レイヤ4のパケットを対象とすることで高いパフォーマンスを実現できる
- アプリケーションゲートウェイ型: アプリケーション層でのフィルタリングを行うため、通信内容に応じた細かな調整が可能
パケットフィルタリング型の firewall の類型:
- ステートレス型: 各パケットを独立して評価する
- ステートフル型: 各パケットの状態を追跡して、セッションごとに通信を管理する
パケットフィルタリング型のフィルタリング対象はレイヤ3(IP, ICMPなど)とレイヤ4(TCP, UDPなど)。
conntrackd: ユーザスペースで動作する Connection Tracking ツールで、状態を netfilter に伝達することでステートフルな firewall の基盤となる。 また、ユーザスペースで動作するデーモンとして駆動する。
OpenVAS(Open Vulnerability Assessment System): オープンソースの脆弱性スキャナソフトウェア。 元々は、 Nessus というオープンソースソフトウェアが源流にある。 Nessus は2005年にリリースされたバージョン3以降、非オープンソースの商用ソフトウェアとなったが、オープンソースのバージョン2をベースに開発が進んだものが OpenVAS プロジェクトとなっている。 また、開発を支援するドイツのセキュリティ企業 Greenbone Networks社による商用サポートも提供されており、GVM(Greenbone Vulnerability Manager) の内のいちコンポートネントとして組み込まれている。
OpenVAS では、脆弱性情報やそれをテストするための設定情報は NVT: Network Vulnerability Tests と呼ばれ、日々更新された内容が NVT Feed と呼ばれる形式で配信されている。 この NVT を更新することで最新の脆弱性に素早く対応することが可能となる。
OpenVAS では、NASL: Nessus Attack Scripting Language というセキュリティ対策用に特化したスクリプト言語を用いて、独自の脆弱性テストを作成することも可能。
OpenVAS の設定ファイルは、 /etc/opanvas に保存される。
GVM(Greenbone Vulnerability Manager): セキュリティスキャンと脆弱性管理を行うためのオープンソースのセキュリティツール。 システムやネットワーク上の脆弱性を検出し、脆弱性情報を管理する。 基本的なユーティリティは以下。
- gvmd: GVMの操作全般を行う
- openvas-scanner: 脆弱性スキャンを実行
- greenbone-nvt-sync: NVTs を更新
- gvm-feed-update: 脆弱性に関連する定義データの更新(これに NVTs も含まれる)
- gvm-manage-certs: GVMのデーモン間のTLS接続を確立するための証明書やCAを管理
VPN(Virtual Private Network)
VPN で利用される主なプロトコルは次の2つ:
- L2TP(Layer 2 Tunneling Protocol)
- IPsec(Security Architecture for Internet Protocol)
IPSec(Security Architecture for Internet Protocol): ネットワーク層でセキュリティ通信を行うためのアーキテクチャ。 単一のプロトコルというよりもプロトコル群。
IPSec内で、さらに細かいプロトコルが利用される。主なものが以下:
- AH(Authentication Header): データの認証
- ESP(Encapsulated Security Payload): データの暗号化+追加の認証
- IKE(Internet Key Exchange): データ通信を行うための共通鍵の交換を行う
IKEには、IKEv1, IKEv2 の2つのバージョンがあり、それぞれに互換性はない。 なお、両方のバージョンに対応した VPNソフトウェアには strongSwan がある。
OpenVPN設定ファイル:
- /etc/openvpn/server.conf: サーバ側
- /etc/openvpn/client.conf: クライアント側
OpenVPN のサーバ、クライアント側で共通する設定項目:
- cipher: 暗号化方式。 サーバとクライアントで一致のこと
- proto: プロトコル。 サーバとクライアントで一致のこと
- ca: CA証明書の指定
- cert: サーバ/クライアント証明書の指定
- key: サーバ/クライアント秘密鍵の指定
OpenVPN のサーバ側のみの設定項目:
- port: OpenVPNが使用するポートの指定(デフォルトは 1194)
OpenVPN のクライアント側のみの設定項目:
- remote: 接続するリモートホスト(OpenVPNサーバ)の指定
- nobind: ポート番号をバインドしない
openvpn コマンドオプション:
- –daemon: デーモンモードで起動
- –mlock: 一時的な鍵をスワップ領域へ書き込まない
- –genkey: 共有秘密鍵の生成(–secret と共に使用)
- –secret: Static Key Encryption モードを有効にする
- –show-ciphers: 使用可能な暗号化アルゴリズムの表示
- –show-tls: 使用可能なTLS暗号の表示
- –tls-timeout: ピアへのパケットを送信する際のタイムアウト(秒)
- –resolv-retry: リモートホストの名前解決を試みる時間(秒)、デフォルトは infinite
WireGuard は、VPNの実装の一つで、カーネルモジュールに採用されている。 IPsecやOpenVPNよりも優れた性能を目指しているプロジェクト。
WireGuard設定ファイル:
- /etc/wireguard/wg0.conf: ここで、wg0 はインターフェース名
wg のサブコマンド:
- genkey: Base64で秘密鍵を生成、標準出力へ出力
- pubkey: 秘密鍵から公開鍵を生成、標準出力へ出力
- show: 設定状態の表示
wg-quick コマンドを使い、WireGuard のセットアップおよび終了処理を行うスクリプトを走らせることができる。 基本的な作動として、インターフェースとIPアドレスの割り当てを行う。
strongSwan の操作は、CLIツールである swanctl コマンドを使う。 また、swanctl コマンドは、VPN接続するホストの設定などを、/etc/swanctl/ 以下に存在する swanctl.conf や証明書などの資格情報から読み込む。
strongSwan 本体の動作設定は、 /etc/strongswan.conf
また、設定ファイルは、 /etc/strongswan.d や /etc/strongswan ディレクトリに保存される。
Access Control
Linuxのアクセス制御の方式は、大きく2種類:
- 任意アクセス制御(DAC: Discretionary Access Control):
-> 所有者が権限を設定。 ファイルやディレクトリパーミッションなど。 - ・強制アクセス制御(MAC: Mandatory Access Control):
-> システム管理者が設定。 SELinux などでセキュリティポリシーに従うもの。
SELinux パーミッションによりアクセスが拒否された場合、AVC(Access Vector Cache) が、ログファイル /var/log/audit/audit.log に記録される。
Linux のパーミッションの評価は以下の順:
通常のLinuxパーミッションの設定 -> SELinuxのパーミッションの設定
getfattr コマンドオプション:
- -n, –name: 指定した名前の拡張属性の表示
- -d, –dump: 全ての拡張属性とその値を表示
getfacl コマンドオプション:
- -a, –access: 設定されているACLの表示(デフォルトオプション)
- -R, –recursive: ディレクティブ内のファイルのACLについても再起的に表示
setfacl コマンドオプション:
- -d, –default: 指定されているACLをデフォルトACLとして設定
- -x: 指定したACL権限を削除する
- -X: 指定したファイルからACL情報を読み込み、該当するACLを削除する
LSM(Linux Security Modules): Linuxのセキュリティモジュールに関するフレームワーク。 SELinux, AppArmor, SMACK などが存在する。
SELinux の方が、SMACKやAppArmor よりも設定が難しい。
セキュリティコンテキストのデータ保持方法:
- AppArmor -> ファイルパスで表現
- SELinux, SMACK -> 拡張属性として保持
AppArmor では、プロファイルと呼ばれるセキュリティポリシーを使用し、アプリケーション単位のアクセス権を設定することができる。
SELinux は、FLASK(Flux Advanced Security Kernel) をベースに開発されている。
SELinux(Security-Enhanced Linux) の大きな特徴は以下:
- RBAC: Role Based Access Control
- MAC: Mandatory Access Control
- TE: Type Enforcement
Apol(SELinux Policy Analysis): SELinux の管理ツールであり、GUIでセキュリティポリシーの分析可能なツール
SELinuxの設定ファイルは、ディレクトリ /etc/selinux に保存されている。
getenforce コマンドでは、SELinux の状態を、”Disabled”, “Permissive”, “Enforcing” のように、文字列で返すのに対し、selinuxenabled コマンドでは、 “1”, “0” のように返す。
※ 0 -> Permissive, Enforcing また、 1 -> Disabled となることに注意
runcon コマンド: 指定したセキュリティコンテキスト上でコマンドを実行する。
seinfo コマンド: SELinux のロールやドメインなどの各種情報を報じする。
newrole コマンド: 指定したロールに変更してシェルを起動
sestatus コマンド: SELinux の状態表示
secon コマンド: ファイルやプロセスに設定されているセキュリティコンテキストを表示。
setcon コマンドオプション:
- –file: ファイルを指定
- –type: タイプの表示
- –role: ロールの表示
- –pid: PIDを指定
SELinux が有効な状態において、Permissive <-> Enforcing のモード切り替えをする場合、OSの再起動は必要ない。 ただし、無効な状態の Disabled に切り替える場合にはOSの再起動が必要となる。
setenforce コマンドでSELinuxの動作モードを変更した場合、システムを再起動すると設定が元に戻ってしまう。(一時的な設定変更) 恒久的に設定変更するのであれば、 /etc/selinux/config ファイルに設定を書き込む。
setenforce コマンドで設定できる動作モード:
- Enforcing -> enforcing | 1
- Permissive -> permissive | 0
- Disabled -> (setenforce コマンドでは設定不可)
コメント