はじめに
こんばんは、mirukyです。
本記事はLPIC-3 303: Security(303-300)の 全トピック・全サブトピック を公式試験要項(Objectives V3.0)に基づいて網羅した試験対策記事です。
LPIC-3 303はLinuxにおけるセキュリティに特化した最上位資格で、暗号化(PKI/DNSSEC/LUKS)、ホストセキュリティ(AIDE/auditd/SELinux/AppArmor)、ネットワークセキュリティ(iptables/nftables/VPN/IDS)、脆弱性評価・ペネトレーションテストまで幅広く出題されます。
LPIC-3 303 試験概要
| 項目 | 内容 |
|---|---|
| 試験コード | 303-300 |
| 試験バージョン | V3.0(最新) |
| 前提条件 | 有効なLPIC-2資格を保有していること |
| 問題数 | 60問 |
| 試験時間 | 90分 |
| 合格ライン | 500点 / 800点満点(約65%) |
| 出題形式 | 選択式・複数選択式・穴埋め式 |
| 有効期間 | 5年 |
| 受験料 | 19,800円(税込)(出典:Pearson VUE公式マーケットプレイス) |
LPIC-3 の位置付け
① LPIC-1(基礎) → LPIC-2(サーバー構築) → LPIC-3(エンタープライズ・専門領域)
- 300: Mixed Environments
- 303: Security ← 本記事
- 305: Virtualization & Containerization
- 306: High Availability & Storage Clusters
試験の中心テーマ
- 暗号技術:X.509証明書、PKI、LUKS、DNSSEC
- ホストセキュリティ:ハードニング、侵入検知、リソース制御
- アクセス制御:DAC、MAC(SELinux/AppArmor)
- ネットワークセキュリティ:パケットフィルタリング、IDS/IPS、VPN
- 脅威と脆弱性評価:CVE、ペネトレーションテスト
Topic 331:暗号技術
331.1 X.509証明書と公開鍵基盤(Weight: 5)
PKI(公開鍵基盤)の構造
① ルートCA(認証局)
- 中間CA
- サーバー証明書
- クライアント証明書
- CRL(証明書失効リスト)/ OCSP(オンライン証明書状態プロトコル)
証明書ファイル形式
| 形式 | 拡張子 | 特徴 |
|---|---|---|
| PEM |
.pem, .crt, .key
|
Base64エンコード。最も一般的 |
| DER |
.der, .cer
|
バイナリ形式 |
| PKCS#12 |
.p12, .pfx
|
秘密鍵+証明書を1ファイルに格納 |
| PKCS#7 | .p7b |
証明書チェーンのみ(秘密鍵なし) |
OpenSSL コマンド集
# --- 秘密鍵の生成 ---
openssl genrsa -out [秘密鍵ファイル名].key 4096 # RSA 4096ビット
openssl genrsa -aes256 -out [秘密鍵ファイル名].key 4096 # パスフレーズ付き
openssl ecparam -genkey -name prime256v1 -out [秘密鍵ファイル名].key # ECDSA
# --- CSR(証明書署名要求)の作成 ---
openssl req -new -key [秘密鍵ファイル名].key -out [CSRファイル名].csr
openssl req -new -key [秘密鍵ファイル名].key -out [CSRファイル名].csr \
-subj "/C=JP/ST=Tokyo/L=Chiyoda/O=Example Inc/CN=www.example.com"
# --- 自己署名証明書の作成 ---
openssl req -x509 -nodes -days 365 -newkey rsa:4096 \
-keyout [秘密鍵ファイル名].key -out [証明書ファイル名].crt
openssl req -x509 -nodes -days 365 -newkey rsa:4096 \
-keyout [秘密鍵ファイル名].key -out [証明書ファイル名].crt \
-subj "/CN=www.example.com"
# --- CA(認証局)の構築 ---
# CA秘密鍵
openssl genrsa -aes256 -out ca.key 4096
# CA証明書(自己署名)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
-out ca.crt -subj "/C=JP/O=MyCA/CN=My Root CA"
# CSRへの署名(証明書発行)
openssl x509 -req -in [CSRファイル名].csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out [証明書ファイル名].crt -days 365 -sha256
# --- 証明書の確認 ---
openssl x509 -in [証明書ファイル名].crt -text -noout # 証明書の内容表示
openssl x509 -in [証明書ファイル名].crt -dates -noout # 有効期限の確認
openssl x509 -in [証明書ファイル名].crt -subject -noout # サブジェクトの確認
openssl x509 -in [証明書ファイル名].crt -issuer -noout # 発行者の確認
openssl req -in [CSRファイル名].csr -text -noout # CSRの内容表示
openssl rsa -in [秘密鍵ファイル名].key -check # 秘密鍵の検証
# --- 形式変換 ---
openssl x509 -in [PEMファイル].crt -outform DER -out [DERファイル].der # PEM→DER
openssl x509 -in [DERファイル].der -inform DER -outform PEM -out [PEMファイル].crt # DER→PEM
openssl pkcs12 -export -out [P12ファイル].p12 -inkey [秘密鍵].key -in [証明書].crt # PKCS#12作成
openssl pkcs12 -in [P12ファイル].p12 -out [PEMファイル].pem -nodes # PKCS#12→PEM
# --- リモートサーバーの証明書確認 ---
openssl s_client -connect [ホスト名]:443 # TLS接続テスト
openssl s_client -connect [ホスト名]:443 -showcerts # 証明書チェーン表示
# --- CRL(証明書失効リスト)---
openssl ca -revoke [証明書ファイル名].crt # 証明書の失効
openssl ca -gencrl -out [CRLファイル名].crl # CRLの生成
openssl crl -in [CRLファイル名].crl -text -noout # CRLの確認
# --- OCSP ---
openssl ocsp -issuer ca.crt -cert [証明書].crt -url [OCSP URL] -resp_text
Let's Encrypt / certbot(V3.0 新規)
# certbotによる証明書取得
certbot certonly --webroot -w /var/www/html -d [ドメイン名]
certbot certonly --standalone -d [ドメイン名]
certbot certonly --dns-cloudflare -d [ドメイン名] # DNSプラグイン
# 証明書の更新
certbot renew # 全証明書の更新
certbot renew --dry-run # テスト実行
# 証明書の一覧・削除
certbot certificates # 証明書一覧
certbot delete --cert-name [ドメイン名] # 証明書削除
# 証明書の格納場所
# /etc/letsencrypt/live/[ドメイン名]/fullchain.pem (証明書チェーン)
# /etc/letsencrypt/live/[ドメイン名]/privkey.pem (秘密鍵)
CFSSL(V3.0 新規)
# CFSSL によるCA構築
cfssl gencert -initca [CA CSR JSON].json | cfssljson -bare ca # CA証明書生成
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=[設定JSON].json \
-profile=[プロファイル名] [CSR JSON].json | cfssljson -bare [出力名] # 証明書発行
cfssl certinfo -cert [証明書ファイル名].pem # 証明書情報
331.2 暗号化・署名・検証のためのX.509証明書(Weight: 4)
Apache HTTPS設定(mod_ssl)
# /etc/httpd/conf.d/ssl.conf(または sites-available/default-ssl.conf)
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCertificateChainFile /etc/pki/tls/certs/chain.crt
# TLSバージョン制御
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 # TLS 1.2以上のみ
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES # 強力な暗号スイートのみ
SSLHonorCipherOrder on # サーバー側の暗号優先
# HSTS(HTTP Strict Transport Security)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# OCSP Stapling
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# クライアント証明書認証
SSLVerifyClient require
SSLVerifyDepth 2
SSLCACertificateFile /etc/pki/tls/certs/ca.crt
</VirtualHost>
# SNI(Server Name Indication)
# 複数のVirtualHostで異なる証明書を使用可能(TLS拡張)
<VirtualHost *:443>
ServerName site2.example.com
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/site2.crt
SSLCertificateKeyFile /etc/pki/tls/private/site2.key
</VirtualHost>
331.3 暗号化ファイルシステム(Weight: 3)
LUKS / dm-crypt
# パーティションの暗号化
cryptsetup luksFormat /dev/[デバイス名] # LUKS初期化
cryptsetup luksFormat --type luks2 /dev/[デバイス名] # LUKS2形式
# 暗号化デバイスのオープン・クローズ
cryptsetup luksOpen /dev/[デバイス名] [マッピング名] # オープン
cryptsetup luksClose [マッピング名] # クローズ
# ファイルシステム作成・マウント
mkfs.ext4 /dev/mapper/[マッピング名]
mount /dev/mapper/[マッピング名] /mnt
# 鍵管理
cryptsetup luksDump /dev/[デバイス名] # ヘッダ情報の表示
cryptsetup luksAddKey /dev/[デバイス名] # 鍵スロットの追加
cryptsetup luksRemoveKey /dev/[デバイス名] # 鍵スロットの削除
cryptsetup luksKillSlot /dev/[デバイス名] [スロット番号] # 特定スロットの削除
cryptsetup luksChangeKey /dev/[デバイス名] # パスフレーズの変更
# ヘッダのバックアップ・復元
cryptsetup luksHeaderBackup /dev/[デバイス名] --header-backup-file [バックアップファイルパス]
cryptsetup luksHeaderRestore /dev/[デバイス名] --header-backup-file [バックアップファイルパス]
# /etc/crypttab(起動時の自動オープン)
# [マッピング名] /dev/[デバイス名] none luks
Clevis / Tang / NBDE(V3.0 新規)
# Tang サーバー(鍵提供サーバー)
systemctl enable tangd.socket
systemctl start tangd.socket
# Clevis でLUKSデバイスにTangバインド(自動解除)
clevis luks bind -d /dev/[デバイス名] tang '{"url":"http://[TangサーバーIP]"}'
# TPM2バインド
clevis luks bind -d /dev/[デバイス名] tpm2 '{}'
# バインド情報の確認
clevis luks list -d /dev/[デバイス名]
eCryptfs
mount -t ecryptfs [暗号化元ディレクトリ] [マウント先ディレクトリ]
ecryptfs-setup-private # ホームディレクトリの暗号化設定
ecryptfs-mount-private # プライベートディレクトリのマウント
ecryptfs-umount-private # アンマウント
331.4 DNSと暗号技術(Weight: 5)
DNSSEC
DNSSECの仕組み
① ルートゾーン(.)→ 署名 → .comゾーン → 署名 → example.comゾーン
② 各ゾーンがKSK(鍵署名鍵)とZSK(ゾーン署名鍵)のペアを持つ
| 鍵の種類 | 説明 |
|---|---|
| ZSK(Zone Signing Key) | ゾーンレコードの署名に使用。頻繁にローテーション |
| KSK(Key Signing Key) | ZSKの署名に使用。ローテーション頻度は低い |
| レコードタイプ | 説明 |
|---|---|
| RRSIG | レコードのデジタル署名 |
| DNSKEY | 公開鍵(ZSK/KSK) |
| DS(Delegation Signer) | 親ゾーンに登録するKSKのハッシュ |
| NSEC / NSEC3 | 不在証明(存在しないレコードの証明) |
コマンド集
# DNSSEC鍵の生成
dnssec-keygen -a ECDSAP256SHA256 -n ZONE [ゾーン名] # ZSK生成
dnssec-keygen -a ECDSAP256SHA256 -n ZONE -f KSK [ゾーン名] # KSK生成
# ゾーンへの署名
dnssec-signzone -o [ゾーン名] -k [KSKファイル名] [ゾーンファイル名] [ZSKファイル名]
# 署名の検証
dig +dnssec [ドメイン名] # DNSSEC対応クエリ
dig +dnssec +cd [ドメイン名] # 検証無効でクエリ
dig DNSKEY [ゾーン名] @[DNSサーバーIP] # DNSKEY確認
dig DS [ゾーン名] @[親DNSサーバーIP] # DSレコード確認
delv [ドメイン名] # DNSSEC検証ツール
# 鍵のローテーション
dnssec-settime -I +30d -D +60d [鍵ファイル名] # 鍵の無効化・削除スケジュール
# BIND設定(named.conf)でDNSSECを有効化
# options {
# dnssec-validation auto;
# };
DANE(DNS-Based Authentication of Named Entities)
# TLSAレコードの確認
dig TLSA _443._tcp.[ドメイン名]
# TLSAレコードの生成
openssl x509 -in [証明書ファイル名].crt -outform DER | \
openssl dgst -sha256 -binary | xxd -p -c 32
# 結果をDNSのTLSAレコードとして登録
Topic 332:ホストセキュリティ
332.1 ホストハードニング(Weight: 5)
ハードニングのチェックリスト
1. 不要なサービスの無効化
2. カーネルパラメータの強化(sysctl)
3. ファイルパーミッションの適正化
4. SSH設定の強化
5. USBデバイスの制御
6. systemdのセキュリティ機能活用
カーネルセキュリティパラメータ(sysctl)
# /etc/sysctl.d/99-security.conf
# IPスプーフィング対策
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ICMP リダイレクト無効化
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# ソースルーティング無効化
net.ipv4.conf.all.accept_source_route = 0
# SYN flood対策
net.ipv4.tcp_syncookies = 1
# ログマーシャン(不正パケットのログ)
net.ipv4.conf.all.log_martians = 1
# ASLR(アドレス空間配置のランダム化)
kernel.randomize_va_space = 2
# コアダンプの制限
fs.suid_dumpable = 0
# 適用
sysctl -p /etc/sysctl.d/99-security.conf
USBGuard(V3.0 新規)
# USBGuardの初期設定
usbguard generate-policy > /etc/usbguard/rules.conf # 現在のデバイスからポリシー生成
# USBGuard管理
systemctl start usbguard
usbguard list-devices # デバイス一覧
usbguard allow-device [デバイスID] # デバイスの許可
usbguard block-device [デバイスID] # デバイスのブロック
usbguard reject-device [デバイスID] # デバイスの拒否
# ルールの例(/etc/usbguard/rules.conf)
# allow id 1234:5678 serial "ABC123" # 特定デバイスを許可
# reject with-interface equals { 08:*:* } # USBストレージを拒否
SSH CA(証明書ベース認証)(V3.0 新規)
# SSH CA鍵の生成
ssh-keygen -f /etc/ssh/ca_user_key # ユーザーCA鍵
ssh-keygen -f /etc/ssh/ca_host_key # ホストCA鍵
# ユーザー公開鍵への署名(証明書発行)
ssh-keygen -s /etc/ssh/ca_user_key -I [証明書ID] -n [ユーザー名] -V +52w [ユーザー公開鍵].pub
# ホスト公開鍵への署名
ssh-keygen -s /etc/ssh/ca_host_key -I [ホスト名] -h -n [ホスト名] -V +52w /etc/ssh/ssh_host_ed25519_key.pub
# sshd_config でCA信頼設定
# TrustedUserCAKeys /etc/ssh/ca_user_key.pub
# HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
# 証明書の内容確認
ssh-keygen -L -f [証明書ファイル名]-cert.pub
polkit(V3.0 新規)
# polkitルールの確認
pkaction --verbose # 全アクション一覧
pkaction --action-id [アクションID] --verbose # 特定アクションの詳細
pkcheck --action-id [アクションID] --process [PID] # 権限チェック
# ルールファイル: /etc/polkit-1/rules.d/ または /usr/share/polkit-1/rules.d/
systemd セキュリティ機能(V3.0 新規)
# ユニットファイルのセキュリティディレクティブ例
[Service]
PrivateTmp=yes # /tmp を分離
ProtectSystem=strict # ファイルシステムを読み取り専用
ProtectHome=yes # /home を非表示
NoNewPrivileges=yes # 特権昇格を禁止
PrivateDevices=yes # /dev を制限
ProtectKernelModules=yes # カーネルモジュール操作を禁止
ProtectKernelTunables=yes # sysctl変更を禁止
RestrictAddressFamilies=AF_INET AF_INET6 # 使用可能なソケットファミリーを制限
MemoryDenyWriteExecute=yes # W^X(書き込み+実行禁止)
# ユニットのセキュリティスコア確認
systemd-analyze security [ユニット名]
332.2 ホスト侵入検知(Weight: 5)
AIDE(Advanced Intrusion Detection Environment)
# データベースの初期化
aide --init # 初期データベース作成
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db # データベースの有効化
# 整合性チェック
aide --check # ファイル変更の検出
aide --update # チェック+データベース更新
# 設定ファイル(/etc/aide/aide.conf)
# /etc CONTENT_EX
# /bin CONTENT_EX
# /sbin CONTENT_EX
# /usr CONTENT_EX
# !/var/log # ログディレクトリを除外
auditd(Linux監査フレームワーク)
# auditdの管理
systemctl start auditd
systemctl enable auditd
auditctl -s # 監査システムの状態
# 監査ルールの追加
auditctl -w /etc/passwd -p wa -k passwd_changes # ファイル監視(書き込み+属性変更)
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
auditctl -a always,exit -F arch=b64 -S execve -k exec_log # コマンド実行の監査
auditctl -a always,exit -F arch=b64 -S mount -k mount_ops # マウント操作の監査
# 監査ルールの一覧・削除
auditctl -l # 現在のルール一覧
auditctl -D # 全ルール削除
# 永続化(/etc/audit/rules.d/audit.rules)
# -w /etc/passwd -p wa -k passwd_changes
# -w /etc/shadow -p wa -k shadow_changes
# ログの検索・レポート
ausearch -k passwd_changes # キーで検索
ausearch -m USER_LOGIN --start today # 今日のログイン
ausearch -ui [UID] # 特定ユーザーの操作
aureport # 監査レポート
aureport --auth # 認証レポート
aureport --login # ログインレポート
aureport --file # ファイルアクセスレポート
aureport --summary # サマリーレポート
パッケージ検証
# RPM ファイル検証
rpm -V [パッケージ名] # パッケージの整合性チェック
rpm -Va # 全パッケージの検証
# Debian ファイル検証
debsums [パッケージ名] # パッケージの整合性チェック
debsums -a # 全パッケージの検証
debsums -c # 変更されたファイルのみ
重要ファイル
-
/etc/aide/aide.conf:AIDE設定 -
/var/lib/aide/aide.db:AIDEデータベース -
/etc/audit/auditd.conf:auditd設定 -
/etc/audit/rules.d/:監査ルール
332.3 リソース制御(Weight: 3)
cgroups
# cgroups v1
cgcreate -g cpu,memory:[グループ名] # cgroupの作成
cgset -r cpu.shares=512 [グループ名] # CPU配分の設定
cgset -r memory.limit_in_bytes=512M [グループ名] # メモリ制限
cgexec -g cpu,memory:[グループ名] [コマンド] # cgroup内でコマンド実行
cgclassify -g cpu,memory:[グループ名] [PID] # プロセスをcgroupに追加
lscgroup # cgroup一覧
# cgroups v2(systemd統合)
systemd-cgls # cgroupツリーの表示
systemd-cgtop # cgroupリソース使用状況
systemd によるリソース制限
# ユニットファイルでの制限
# [Service]
# CPUQuota=50% # CPU使用率制限
# MemoryMax=512M # メモリ上限
# MemoryHigh=256M # メモリソフト上限
# TasksMax=100 # プロセス数上限
# IOWeight=100 # I/O重み
# systemd slice
systemctl set-property [ユニット名] CPUQuota=50% # 動的に制限変更
systemctl set-property [ユニット名] MemoryMax=512M
# ulimit
ulimit -a # 現在の制限一覧
ulimit -n 4096 # オープンファイル数
ulimit -u 2048 # プロセス数
# /etc/security/limits.conf
# [ユーザー名] hard nofile 65536
# [ユーザー名] hard nproc 4096
# @[グループ名] soft nofile 4096
Topic 333:アクセス制御
333.1 任意アクセス制御(DAC)(Weight: 3)
コマンド集
# 標準パーミッション
chmod 750 [ファイルパス] # rwxr-x---
chmod u+s [ファイルパス] # SUID設定
chmod g+s [ディレクトリパス] # SGID設定
chmod +t [ディレクトリパス] # Sticky Bit設定
chown [ユーザー名]:[グループ名] [ファイルパス] # 所有者変更
umask 027 # デフォルトパーミッションマスク
# 拡張属性
chattr +i [ファイルパス] # 変更不可(immutable)
chattr +a [ファイルパス] # 追記のみ許可
lsattr [ファイルパス] # 拡張属性の表示
# ACL(アクセス制御リスト)
setfacl -m u:[ユーザー名]:rwx [ファイルパス] # ユーザーACL追加
setfacl -m g:[グループ名]:rx [ファイルパス] # グループACL追加
setfacl -m d:u:[ユーザー名]:rwx [ディレクトリパス] # デフォルトACL
setfacl -x u:[ユーザー名] [ファイルパス] # ACL削除
setfacl -b [ファイルパス] # 全ACL削除
getfacl [ファイルパス] # ACLの表示
333.2 強制アクセス制御(MAC)(Weight: 5)
SELinux
SELinuxのモード
| モード | 説明 |
|---|---|
| Enforcing | ポリシーを強制適用。違反はブロック+ログ |
| Permissive | ポリシー違反をログのみ。ブロックしない |
| Disabled | SELinux無効 |
コマンド集
# モード管理
getenforce # 現在のモード確認
setenforce 1 # Enforcingに変更
setenforce 0 # Permissiveに変更
sestatus # SELinux詳細状態
# セキュリティコンテキスト
ls -Z [ファイルパス] # ファイルのコンテキスト表示
ps -eZ # プロセスのコンテキスト表示
id -Z # 現在のユーザーコンテキスト
# コンテキスト変更
chcon -t [タイプ] [ファイルパス] # コンテキストの一時変更
restorecon -Rv [ディレクトリパス] # デフォルトに復元
# semanage(永続的なポリシー管理)
semanage fcontext -a -t [タイプ] "[パスの正規表現](/.*)?" # ファイルコンテキスト定義
semanage fcontext -l # 定義一覧
semanage port -a -t [タイプ] -p tcp [ポート番号] # ポートラベル追加
semanage port -l # ポートラベル一覧
semanage boolean -l # ブール値一覧
semanage login -l # ログインマッピング一覧
# ブール値
getsebool -a # 全ブール値の表示
setsebool [ブール名] on # ブール値の一時変更
setsebool -P [ブール名] on # ブール値の永続変更
# トラブルシューティング
sealert -a /var/log/audit/audit.log # 拒否ログの分析
audit2why < /var/log/audit/audit.log # 拒否理由の表示
audit2allow -a -M [モジュール名] # カスタムポリシーモジュール作成
semodule -i [モジュール名].pp # ポリシーモジュールのインストール
AppArmor
AppArmorのモード
| モード | 説明 |
|---|---|
| Enforce | プロファイルを強制適用 |
| Complain | 違反をログのみ(学習モード) |
| Disabled | プロファイル無効 |
コマンド集
# 状態確認
aa-status # 全プロファイルの状態
apparmor_status # aa-statusの別名
# モード変更
aa-enforce /etc/apparmor.d/[プロファイル名] # Enforceモードに変更
aa-complain /etc/apparmor.d/[プロファイル名] # Complainモードに変更
aa-disable /etc/apparmor.d/[プロファイル名] # プロファイル無効化
# プロファイル管理
apparmor_parser -r /etc/apparmor.d/[プロファイル名] # プロファイル再読み込み
apparmor_parser -a /etc/apparmor.d/[プロファイル名] # プロファイル追加
aa-genprof [プログラムパス] # プロファイルの自動生成
aa-logprof # ログからプロファイル更新
重要ファイル
-
/etc/selinux/config:SELinux設定(モード・ポリシー) -
/var/log/audit/audit.log:SELinux監査ログ -
/etc/apparmor.d/:AppArmorプロファイル -
/var/log/syslog//var/log/kern.log:AppArmorログ
Topic 334:ネットワークセキュリティ
334.1 ネットワークハードニング(Weight: 4)
コマンド集
# 開いているポートの確認
ss -tuln # リッスンポート
ss -tunap # プロセス情報付き
lsof -i -P -n # ネットワーク接続中のプロセス
# 不要サービスの無効化
systemctl list-units --type=service --state=running # 実行中サービス
systemctl disable --now [サービス名] # 無効化+停止
systemctl mask [サービス名] # 完全無効化
# firewalld
firewall-cmd --list-all # 現在のルール一覧
firewall-cmd --add-service=[サービス名] --permanent # サービス許可
firewall-cmd --add-port=[ポート]/tcp --permanent # ポート許可
firewall-cmd --remove-service=[サービス名] --permanent # サービス削除
firewall-cmd --reload # 設定再読み込み
firewall-cmd --get-active-zones # アクティブゾーン
334.2 ネットワーク侵入検知(Weight: 4)
Snort
# Snortの実行
snort -T -c /etc/snort/snort.conf # 設定テスト
snort -A console -q -c /etc/snort/snort.conf -i [インターフェース名] # コンソールアラート
snort -c /etc/snort/snort.conf -l /var/log/snort -i [インターフェース名] # ログモード
# ルールの例(/etc/snort/rules/local.rules)
# alert tcp any any -> any 22 (msg:"SSH connection attempt"; sid:1000001; rev:1;)
# alert icmp any any -> any any (msg:"ICMP ping detected"; sid:1000002; rev:1;)
Suricata
# Suricataの実行
suricata -T -c /etc/suricata/suricata.yaml # 設定テスト
suricata -c /etc/suricata/suricata.yaml -i [インターフェース名] # IDSモード
suricata --af-packet -c /etc/suricata/suricata.yaml # AF_PACKETモード
# ルール管理
suricata-update # ルールの自動更新
suricata-update list-sources # ルールソース一覧
# ログ
# /var/log/suricata/eve.json # JSON形式イベントログ
# /var/log/suricata/fast.log # 簡易アラートログ
重要ファイル
-
/etc/snort/snort.conf:Snort設定 -
/etc/snort/rules/:Snortルール -
/etc/suricata/suricata.yaml:Suricata設定 -
/var/log/suricata/:Suricataログ
334.3 パケットフィルタリング(Weight: 5)
iptables
# 基本的なファイアウォール設定
iptables -P INPUT DROP # デフォルト拒否
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 許可ルール
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 確立済み接続
iptables -A INPUT -i lo -j ACCEPT # ループバック許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # ping
# レート制限(ブルートフォース対策)
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
# ログ
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4
# NAT
iptables -t nat -A POSTROUTING -o [外部IF] -j MASQUERADE # マスカレード
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination [内部IP]:80
# 保存・復元
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6 # IPv6
ip6tables-restore < /etc/iptables/rules.v6
nftables
# 基本設定
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
# ルール追加
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input tcp dport 443 accept
nft add rule inet filter input counter drop # カウンタ付きドロップ
# ルール一覧
nft list ruleset
nft list table inet filter
# 設定の保存・復元
nft list ruleset > /etc/nftables.conf
nft -f /etc/nftables.conf
334.4 仮想プライベートネットワーク(VPN)(Weight: 4)
OpenVPN
# サーバー起動
systemctl start openvpn@[設定名]
openvpn --config /etc/openvpn/[設定ファイル名].conf
# Easy-RSAによるPKI構築(詳細はLPIC-3 300記事参照)
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req [サーバー名] nopass
./easyrsa sign-req server [サーバー名]
./easyrsa gen-req [クライアント名]
./easyrsa sign-req client [クライアント名]
./easyrsa gen-dh
WireGuard(V3.0 新規)
# 鍵の生成
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
# 設定例(/etc/wireguard/wg0.conf)
# [Interface]
# PrivateKey = [サーバー秘密鍵]
# Address = 10.0.0.1/24
# ListenPort = 51820
#
# [Peer]
# PublicKey = [クライアント公開鍵]
# AllowedIPs = 10.0.0.2/32
# WireGuard操作
wg-quick up wg0 # インターフェース起動
wg-quick down wg0 # インターフェース停止
wg show # 接続状態の確認
wg show wg0 # 特定インターフェースの状態
systemctl enable wg-quick@wg0 # 自動起動有効化
IPsec(strongSwan)
# strongSwanの管理
systemctl start strongswan # 起動
ipsec status # 接続状態
ipsec statusall # 全接続の詳細
ipsec up [接続名] # 接続の開始
ipsec down [接続名] # 接続の停止
ipsec restart # 再起動
設定例(/etc/ipsec.conf)
config setup
charondebug="ike 2, knl 2"
conn site-to-site
type=tunnel
left=192.168.1.1
leftsubnet=192.168.1.0/24
leftcert=server.crt
leftid=@server.example.com
right=203.0.113.1
rightsubnet=10.0.0.0/24
rightid=@remote.example.com
auto=start
ike=aes256-sha256-modp2048
esp=aes256-sha256
重要ファイル
-
/etc/openvpn/:OpenVPN設定 -
/etc/wireguard/:WireGuard設定 -
/etc/ipsec.conf:strongSwan設定 -
/etc/ipsec.secrets:IPsec認証情報 -
/etc/strongswan.conf:strongSwan詳細設定
Topic 335:脅威と脆弱性評価
335.1 一般的なセキュリティ脆弱性と脅威(Weight: 2)
主要な脅威と脆弱性
| 脅威/脆弱性 | 説明 |
|---|---|
| バッファオーバーフロー | メモリ領域を超えたデータ書き込みによるコード実行 |
| 権限昇格(Privilege Escalation) | 一般ユーザーがroot権限を不正取得 |
| DoS / DDoS | サービスを過負荷にして停止させる攻撃 |
| XSS(Cross-Site Scripting) | Webアプリにスクリプトを注入 |
| CSRF(Cross-Site Request Forgery) | ユーザーに意図しないリクエストを実行させる |
| SQLインジェクション | SQL文の注入によるDB操作 |
| MITM(Man-in-the-Middle) | 通信の中間に入り盗聴・改ざん |
| AIT(Artificially Inflated Traffic) | 人為的なトラフィック水増し |
CVE / 脆弱性管理
# 脆弱性情報の確認
# CVE(Common Vulnerabilities and Exposures): https://cve.mitre.org/
# NVD(National Vulnerability Database): https://nvd.nist.gov/
# パッケージの脆弱性チェック
yum updateinfo list security # RHEL系
apt list --upgradable # Debian系
335.2 ペネトレーションテスト(Weight: 3)
ペネトレーションテストの流れ
1. 偵察(Reconnaissance) → 情報収集
2. スキャニング(Scanning) → 脆弱性特定
3. 攻撃(Exploitation) → 脆弱性の悪用
4. 権限昇格(Escalation) → より高い権限の取得
5. レポート(Reporting) → 結果と改善策の報告
コマンド集
# --- Nmap(ポートスキャン)---
nmap [対象IP] # 基本スキャン
nmap -sV [対象IP] # サービスバージョン検出
nmap -O [対象IP] # OS検出
nmap -sS [対象IP] # SYNスキャン(ステルス)
nmap -p 1-65535 [対象IP] # 全ポートスキャン
nmap -sU [対象IP] # UDPスキャン
nmap --script vuln [対象IP] # 脆弱性スクリプト
nmap -A [対象IP] # 全検出(OS+バージョン+スクリプト+traceroute)
# --- Nikto(Webサーバースキャン)---
nikto -h http://[対象URL] # Webサーバースキャン
# --- OpenVAS / GVM(脆弱性スキャナ)---
# GUIベースの脆弱性スキャナ(認識レベル)
# --- Metasploit(エクスプロイトフレームワーク)---
msfconsole # Metasploit起動
# use [モジュールパス]
# set RHOST [対象IP]
# exploit
# --- Hydra(パスワードブルートフォース)---
hydra -l [ユーザー名] -P [パスワードリストファイル] [対象IP] ssh
hydra -l [ユーザー名] -P [パスワードリストファイル] [対象IP] ftp
出題比率(Weight)ランキング
| 順位 | サブトピック | Weight | 内容 |
|---|---|---|---|
| 1 | 331.1 | 5 | X.509証明書とPKI |
| 1 | 331.4 | 5 | DNSと暗号技術(DNSSEC) |
| 1 | 332.1 | 5 | ホストハードニング |
| 1 | 332.2 | 5 | ホスト侵入検知 |
| 1 | 333.2 | 5 | 強制アクセス制御(SELinux/AppArmor) |
| 1 | 334.3 | 5 | パケットフィルタリング |
| 7 | 331.2 | 4 | 暗号化・署名・認証のためのX.509証明書 |
| 7 | 334.1 | 4 | ネットワークハードニング |
| 7 | 334.2 | 4 | ネットワーク侵入検知 |
| 7 | 334.4 | 4 | VPN |
| 11 | 331.3 | 3 | 暗号化ファイルシステム |
| 11 | 332.3 | 3 | リソース制御 |
| 11 | 333.1 | 3 | 任意アクセス制御 |
| 11 | 335.2 | 3 | ペネトレーションテスト |
| 15 | 335.1 | 2 | 一般的なセキュリティ脆弱性と脅威 |
試験対策のポイント
頻出テーマ 暗記チェックリスト
Topic 331:暗号技術
-
opensslの主要サブコマンド(genrsa, req, x509, ca, s_client, pkcs12, crl) - 証明書ファイル形式の違い(PEM, DER, PKCS#12)
- CSR作成→CA署名→証明書発行の一連の流れ
- certbot によるLet's Encrypt証明書の取得・更新
- LUKS/dm-crypt の操作(luksFormat, luksOpen, luksAddKey等)
- Clevis/Tang/NBDE によるネットワークベースの自動解除(V3.0新規)
- DNSSEC の鍵(ZSK/KSK)とレコードタイプ(RRSIG, DNSKEY, DS)
-
dnssec-keygen,dnssec-signzoneの使い方 - DANE/TLSAレコード
Topic 332:ホストセキュリティ
- sysctl によるカーネルセキュリティパラメータ
- USBGuard の設定と操作(V3.0新規)
- SSH CA による証明書ベース認証(V3.0新規)
- systemd セキュリティディレクティブ(PrivateTmp, ProtectSystem等)(V3.0新規)
- polkit によるアクション権限管理(V3.0新規)
- AIDE のデータベース初期化・チェック・更新
- auditd / auditctl / ausearch / aureport のコマンド体系
- rpm -V / debsums によるパッケージ検証
- cgroups / systemd slice によるリソース制限
Topic 333:アクセス制御
- 標準パーミッション・特殊パーミッション(SUID/SGID/Sticky Bit)
- ACL(setfacl / getfacl)
- SELinux のモード・コンテキスト・ブール値・semanage
- SELinux トラブルシューティング(audit2why / audit2allow)
- AppArmor のプロファイル・モード・管理コマンド
Topic 334:ネットワークセキュリティ
- iptables / nftables のテーブル・チェーン・ルール構造
- ステートフルファイアウォール設定
- NAT/マスカレード設定
- Snort / Suricata の設定とルール記述
- OpenVPN のPKI構築と設定
- WireGuard の鍵生成・設定・操作(V3.0新規)
- IPsec(strongSwan)の設定
Topic 335:脅威と脆弱性評価
- 主要な脅威の種類(バッファオーバーフロー、権限昇格、XSS、CSRF等)
- CVE / NVD の概念
- nmap の主要オプション(-sV, -O, -sS, -p, --script)
- ペネトレーションテストの手順(偵察→スキャン→攻撃→報告)
V2.0 → V3.0 変更点まとめ
| 項目 | V2.0 | V3.0 |
|---|---|---|
| Let's Encrypt / certbot | 範囲外 | 出題範囲 |
| CFSSL | 範囲外 | 出題範囲 |
| WireGuard | 範囲外 | 出題範囲 |
| Clevis / Tang / NBDE | 範囲外 | 出題範囲 |
| USBGuard | 範囲外 | 出題範囲 |
| SSH CA | 範囲外 | 出題範囲 |
| polkit | 範囲外 | 出題範囲 |
| systemdセキュリティ機能 | 範囲外 | 出題範囲 |
| Suricata | 認識レベル | 重要度向上 |
おわりに
LPIC-3 303 SecurityはWeight 5のサブトピックが 6つ あり、試験全体の約50%を占めます。特に以下に重点を置いて学習してください:
- OpenSSLによる証明書管理(PKI全般)
- DNSSEC(鍵生成・ゾーン署名・検証)
- SELinux / AppArmor(MACの設定・トラブルシューティング)
- iptables / nftables(パケットフィルタリング)
- AIDE / auditd(ホスト侵入検知)
- ホストハードニング(USBGuard、SSH CA、systemdセキュリティ等)
V3.0で追加されたWireGuard、Clevis/Tang、USBGuard、SSH CA、polkit、systemdセキュリティ機能は 確実に出題される ため、実際に手を動かして練習してください。
学習の進め方としては:
- 自己署名CAを構築し、証明書の発行・検証・失効を実践する
- SELinuxをEnforcingモードで運用し、トラブルシューティングを経験する
- iptables / nftables で実用的なファイアウォールを構築する
- WireGuardでVPNトンネルを構築する(V3.0新規)
- AIDE / auditd で変更検知の仕組みを構築する
- DNSSECでゾーンに署名し、digで検証する
この記事が合格への一助になれば幸いです。
ここまでお読みいただきありがとうございます。
ではまた、お会いしましょう。
参考リンク
- [LPIC-3 Exam 303 Objectives(LPI公式)](https
