Linux サーバーセキュリティ強化 完全ガイド
なぜ Linux サーバーのセキュリティ強化が重要なのか
クラウドネイティブ時代において、Linux サーバーはインターネットインフラの中核です。強化されていないサーバーは開かれた扉のようなもので、ブルートフォース攻撃、権限昇格、データ漏洩、ボットネット化の危険に常に晒されています。
| 脅威タイプ | 未強化のリスク | 強化後の効果 |
|---|---|---|
| ブルートフォース | SSHパスワードクラックの成功率が極めて高い | 鍵認証 + fail2ban でクラックはほぼ不可能 |
| 権限昇格 | 一般ユーザーが root に昇格可能 | 最小権限の原則 + sudo 監査 |
| データ漏洩 | 機密ファイルが誰でも読み取り可能 | アクセス制御 + 暗号化 + 不変属性 |
| 横展開 | ネットワーク分離なし、1台侵害で全台侵害 | ファイアウォールホワイトリスト + ネットワーク分離 |
| サプライチェーン攻撃 | 任意のパッケージがインストール可能 | 自動セキュリティアップデート + 整合性検証 |
セキュリティ強化は一度きりの作業ではなく、継続的な運用のセキュリティベースラインです。本記事では初期評価から継続的監視まで、完全な強化ワークフローを解説します。
セキュリティベースライン評価
自動スキャンツールによる現状把握
強化の前に、サーバーの現在のセキュリティ状況を理解する必要があります。以下のツールでベースライン評価を行います:
# Lynis のインストール — オープンソースセキュリティ監査ツール
sudo apt install lynis
# 完全なセキュリティ監査を実行
sudo lynis audit system
# 監査レポートを確認
sudo lynis audit system --report-file /var/log/lynis-report.txt
# 特定モジュールのみ監査
sudo lynis audit system --tests-from-group "authentication"
sudo lynis audit system --tests-from-group "firewall"
手動ベースラインチェックリスト
# オープンポートの確認
ss -tlnp
netstat -tlnp
# 実行中のサービスの確認
systemctl list-units --type=service --state=running
# インストール済みパッケージのセキュリティアップデート確認
apt list --upgradable 2>/dev/null | grep -i security
# SUID/SGID ファイルの確認
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
# ワールド書き込み可能ファイルの確認
find / -perm -o+w -type f 2>/dev/null | grep -v '/proc\|/sys\|/dev'
# 空パスワードアカウントの確認
awk -F: '$2 == "" {print $1}' /etc/shadow
# root のリモートログイン可否確認
grep "^PermitRootLogin" /etc/ssh/sshd_config
OpenSCAP によるコンプライアンスチェック
# OpenSCAP のインストール
sudo apt install openscap-scanner scap-security-guide
# DISA STIG プロファイルで評価
sudo oscap xccdf eval \
--profile xccdf_org.ssgproject.content_profile_stig \
/usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml \
--report /var/log/oscap-report.html
SSH 強化
SSH は Linux サーバーのリモート管理における主要なチャネルであり、攻撃者の最初の標的です。SSH 強化は防御の最前線です。
パスワード認証の無効化、鍵認証のみ
# ED25519 鍵ペアの生成(推奨、RSA より安全で短い)
ssh-keygen -t ed25519 -C "admin@server-01" -f ~/.ssh/id_ed25519
# または RSA 4096ビット鍵の生成(互換性重視)
ssh-keygen -t rsa -b 4096 -C "admin@server-01" -f ~/.ssh/id_rsa_4096
# 公開鍵をサーバーにデプロイ
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
# sshd 設定の変更
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# /etc/ssh/sshd_config — SSH セキュリティ強化設定
# パスワード認証の無効化
PasswordAuthentication no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no
# root ログインの無効化
PermitRootLogin no
# 鍵認証のみ許可
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# デフォルトポートの変更(自動スキャンを回避)
Port 2222
# 認証試行回数の制限
MaxAuthTries 3
# ログインタイムアウトの短縮
LoginGraceTime 30
# 空パスワードの無効化
PermitEmptyPasswords no
# ログイン可能ユーザーの制限
AllowUsers deploy admin@10.0.1.0/24
# 不要な認証方式の無効化
HostbasedAuthentication no
GSSAPIAuthentication no
KerberosAuthentication no
# 強力な暗号アルゴリズムの使用
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# X11転送とポート転送の無効化(不要な場合)
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
# クライアントキープアライブ検出
ClientAliveInterval 300
ClientAliveCountMax 2
# 設定の構文検証後に再起動
sudo sshd -t && sudo systemctl restart sshd
fail2ban でブルートフォース対策
sudo apt install fail2ban -y
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
action = %(action_mwl)s
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
[sshd-ddos]
enabled = true
port = 2222
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 5
bantime = 86400
sudo systemctl enable --now fail2ban
# BAN された IP の確認
sudo fail2ban-client status sshd
# IP の手動解除
sudo fail2ban-client set sshd unbanip 192.168.1.100
ファイアウォール設定
UFW の使用(Ubuntu 向け簡易ファイアウォール)
sudo apt install ufw -y
# デフォルトで全着信を拒否、全発信を許可
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH を許可(sshd 設定とポートを一致させる)
sudo ufw allow 2222/tcp comment 'SSH'
# HTTP/HTTPS を許可
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
# 特定IPから特定ポートへのアクセスを許可
sudo ufw allow from 10.0.1.0/24 to any port 5432 proto tcp comment 'PostgreSQL from internal'
# ファイアウォールの有効化
sudo ufw enable
# ステータスとルールの確認
sudo ufw status verbose
sudo ufw show added
# ルールの削除
sudo ufw delete allow 80/tcp
nftables の使用(iptables の推奨代替)
sudo apt install nftables -y
# /etc/nftables.conf
table inet firewall {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply } accept
ip protocol icmp icmp type { destination-unreachable, time-exceeded, parameter-problem, echo-request, echo-reply } accept
tcp dport 2222 accept comment "SSH"
tcp dport { 80, 443 } accept comment "HTTP/HTTPS"
tcp dport 5432 ip saddr 10.0.1.0/24 accept comment "PostgreSQL internal"
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
sudo systemctl enable --now nftables
sudo nft list ruleset
iptables ルール例
# 既存ルールのフラッシュ
sudo iptables -F
sudo iptables -X
# デフォルトポリシー
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# ループバックインターフェースの許可
sudo iptables -A INPUT -i lo -j ACCEPT
# 確立済み接続の許可
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH の許可
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# HTTP/HTTPS の許可
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ルールの保存
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
ユーザーと権限管理
root 直接操作の代わりに sudo を使用
# sudo のインストール
sudo apt install sudo -y
# 新規ユーザーの作成と sudo グループへの追加
sudo adduser deploy
sudo usermod -aG sudo deploy
# パスワードなし sudo の設定(特定コマンドのみ)
sudo visudo -f /etc/sudoers.d/deploy
# /etc/sudoers.d/deploy — 最小権限 sudo 設定
# deploy ユーザーに特定サービスの再起動を許可
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart postgresql
# ログの閲覧を許可
deploy ALL=(ALL) NOPASSWD: /usr/bin/journalctl
# sudo su や sudo bash による昇格を禁止
deploy ALL=(ALL) !/bin/su, !/bin/bash, !/bin/sh
ユーザーグループと権限分離
# 機能グループの作成
sudo groupadd webadmin
sudo groupadd dbadmin
sudo groupadd logreader
# ユーザーを対応グループに追加
sudo usermod -aG webadmin deploy
sudo usermod -aG dbadmin dbuser
# グループ所有権の設定
sudo chgrp -R webadmin /var/www
sudo chmod -R 2775 /var/www
# データベースディレクトリの権限設定
sudo chgrp -R dbadmin /var/lib/postgresql
sudo chmod -R 750 /var/lib/postgresql
PAM 認証モジュールの強化
# /etc/pam.d/common-password — パスワード複雑性要件
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
password requisite pam_pwhistory.so remember=5 enforce_for_root
# /etc/pam.d/common-auth — ログイン失敗時のロックアウト
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900
auth sufficient pam_faillock.so authsucc deny=5 unlock_time=900
# パスワード有効期限ポリシーの設定
sudo chage -M 90 -m 7 -W 14 deploy
# ユーザーのパスワードポリシー確認
sudo chage -l deploy
ファイルシステムセキュリティ
重要な権限設定
# /etc/shadow と /etc/gshadow は root のみ読み取り可能に
sudo chmod 600 /etc/shadow /etc/gshadow
# /etc/passwd と /etc/group は全員読み取り可能、root のみ書き込み可能に
sudo chmod 644 /etc/passwd /etc/group
# SSH ディレクトリの権限
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/id_*
sudo chmod 644 ~/.ssh/id_*.pub
# crontab アクセスの制限
sudo touch /etc/cron.allow
sudo chmod 600 /etc/cron.allow
echo "root" | sudo tee -a /etc/cron.allow
echo "deploy" | sudo tee -a /etc/cron.allow
不変属性で重要ファイルを保護
# 不変属性の設定(root も含め一切の変更を防止)
sudo chattr +i /etc/passwd
sudo chattr +i /etc/shadow
sudo chattr +i /etc/group
sudo chattr +i /etc/gshadow
sudo chattr +i /etc/sudoers
sudo chattr +i /etc/ssh/sshd_config
# 属性の確認
lsattr /etc/passwd
# 変更が必要な場合はまず解除
sudo chattr -i /etc/passwd
# 変更後に再設定
sudo chattr +i /etc/passwd
ディスク暗号化
# LUKS でデータパーティションを暗号化
sudo apt install cryptsetup -y
# パーティションの暗号化(注意:パーティションのデータが消去されます!)
sudo cryptsetup luksFormat /dev/sdb1
# 暗号化パーティションを開く
sudo cryptsetup luksOpen /dev/sdb1 encrypted_data
# ファイルシステムの作成
sudo mkfs.ext4 /dev/mapper/encrypted_data
# マウント
sudo mount /dev/mapper/encrypted_data /mnt/secure-data
# 起動時の自動マウント(/etc/crypttab)
echo "encrypted_data /dev/sdb1 none luks" | sudo tee -a /etc/crypttab
カーネルパラメータチューニング(sysctl)
ネットワークセキュリティパラメータ
# /etc/sysctl.d/99-security.conf
# IPフォワーディングの無効化(ルーター以外)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# ソースルーティングの無効化
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# 逆パスフィルタリングの有効化
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.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# ICMPブロードキャスト要求の無視
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 偽のICMPエラー応答の無視
net.ipv4.icmp_ignore_bogus_error_responses = 1
# SYN Flood 対策
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# 接続キューの制限
net.ipv4.tcp_max_tw_buckets = 14400
ファイルシステムとメモリ保護
# /etc/sysctl.d/99-security.conf(続き)
# ptrace トレースの制限(デバッグによる昇格を防止)
kernel.yama.ptrace_scope = 2
# ASLR(アドレス空間配置のランダム化)の有効化
kernel.randomize_va_space = 2
# コアダンプの制限
fs.suid_dumpable = 0
# dmesg 出力を root のみに制限
kernel.dmesg_restrict = 1
# kexec ロードの制限
kernel.kexec_load_restrict = 1
# ハードリンクとシンボリックリンクの保護
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_fifos = 2
fs.protected_regular = 2
# 設定の適用
sudo sysctl --system
# 主要パラメータの確認
sysctl net.ipv4.tcp_syncookies
sysctl kernel.randomize_va_space
システム監査(auditd)
インストールと設定
sudo apt install auditd audispd-plugins -y
# /etc/audit/auditd.conf
log_file = /var/log/audit/audit.log
log_format = ENRICHED
max_log_file = 50
num_logs = 5
max_log_file_action = ROTATE
space_left = 100
space_left_action = EMAIL
admin_space_left = 50
admin_space_left_action = SUSPEND
action_mail_acct = root
監査ルール
# /etc/audit/rules.d/audit.rules
# 既存ルールの全削除
-D
# バッファサイズ
-b 8192
# 障害モード
-f 1
# 特権コマンドの監視
-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k priv_escalation
-a always,exit -F arch=b64 -S chown,chmod -F auid>=1000 -F auid!=4294967295 -k perm_change
# 重要ファイルの変更を監視
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
# システムコールの監視
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid>=1000 -F auid!=4294967295 -k file_delete
# ネットワーク接続の監視
-a always,exit -F arch=b64 -S connect -F auid>=1000 -F auid!=4294967295 -k network_connect
# 監査サービスの再起動
sudo systemctl restart auditd
# 監査ログの確認
sudo ausearch -k sshd_config -ts today
sudo ausearch -k priv_escalation -ts recent
# 監査レポートの生成
sudo aureport -x
sudo aureport -k
ログ管理と監視
journalctl 永続化設定
# 永続ジャーナルディレクトリの作成
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=2G
SystemMaxFileSize=100M
MaxRetentionSec=30day
RateLimitIntervalSec=30s
RateLimitBurst=1000
# ログの確認
sudo journalctl -u sshd --since "1 hour ago"
sudo journalctl -p err --since today
sudo journalctl -f # リアルタイム追跡
rsyslog 集中ログ
# /etc/rsyslog.d/50-remote.conf — リモートサーバーにログを転送
*.* @@log-server.example.com:514;RSYSLOG_TraditionalFileFormat
# /etc/rsyslog.d/99-security.conf — セキュリティ関連ログの個別保存
auth,authpriv.* /var/log/auth.log
kern.* /var/log/kern.log
mail.* -/var/log/mail.log
*.emerg :omusrmsg:*
Logwatch によるログサマリー
sudo apt install logwatch -y
# 本日のログサマリーを生成
sudo logwatch --output stdout --range today --detail high
# 毎日の自動メールレポート
sudo logwatch --output mail --mailto admin@example.com --range yesterday --detail med
自動セキュリティアップデート
sudo apt install unattended-upgrades apt-listchanges -y
# /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESMInfrastructure:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailOnlyOnError "true";
# /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
# 自動アップデートの状態確認
sudo unattended-upgrade --dry-run --verbose
コンテナセキュリティの基礎
Docker セキュリティ強化
# /etc/docker/daemon.json
{
"icc": false,
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"userns-remap": "default",
"no-new-privileges": true,
"seccomp-profile": "/etc/docker/seccomp.json",
"bip": "172.17.0.1/16",
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 1024
}
}
}
# コンテナ実行時のセキュリティベストプラクティス
docker run -d \
--name webapp \
--read-only \
--tmpfs /tmp:noexec,nosuid,size=100m \
--tmpfs /run:noexec,nosuid,size=10m \
--pids-limit 100 \
--memory 512m \
--cpus 1.0 \
--security-opt no-new-privileges \
--security-opt apparmor=docker-default \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
--user 1000:1000 \
myapp:latest
Podman デーモンレスコンテナ
# Podman はデフォルトで rootless 実行、より安全
podman run -d \
--read-only \
--pids-limit 100 \
--memory 512m \
--cap-drop ALL \
--security-opt no-new-privileges \
myapp:latest
侵入検知
AIDE ファイル整合性検知
sudo apt install aide -y
# データベースの初期化
sudo aideinit
# 初期データベースを本番データベースにコピー
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 整合性チェックの実行
sudo aide --check
# データベースの更新(正当な変更後)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# /etc/aide/aide.conf — カスタム検知ルール
# 重要ディレクトリの厳格な検知
/etc p+i+n+u+g+s+b+m+c+sha512
/root p+i+n+u+g+s+b+m+c+sha512
# 頻繁に変化するディレクトリを除外
!/var/log
!/var/run
!/proc
!/sys
!/dev
!/tmp
ルートキット検知
# rkhunter と chkrootkit のインストール
sudo apt install rkhunter chkrootkit -y
# /etc/rkhunter.conf
UPDATE_MIRRORS=1
MIRRORS_MODE=0
WEB_CMD=curl
ALLOW_SSH_ROOT_USER=no
ALLOW_SSH_PROT_V1=no
DISABLE_TESTS=apps
# rkhunter データベースの更新
sudo rkhunter --update
# システムチェックの実行
sudo rkhunter --check --skip-keypress
# chkrootkit 検知
sudo chkrootkit
# 毎日の自動チェックを設定
echo "0 3 * * * root /usr/bin/rkhunter --check --skip-keypress --report-warnings-only" | \
sudo tee /etc/cron.d/rkhunter
SSL/TLS 強化
Nginx SSL 設定
# /etc/nginx/snippets/ssl-hardening.conf
ssl_protocol TLSv1.2 TLSv1.3;
ssl_cipher TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
強力な DH パラメータの生成
openssl dhparam -out /etc/nginx/dhparam.pem 2048
一般的な攻撃ベクトルと防御
DDoS 攻撃への防御
# sysctl で SYN Flood を緩和
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sudo sysctl -w net.core.somaxconn=65535
# iptables で接続レートを制限
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
バッファオーバーフローへの防御
# ASLR の有効化
sudo sysctl -w kernel.randomize_va_space=2
# NX ビットの有効化(No-eXecute、現代のCPUではデフォルトで有効)
# コンパイル時に -fstack-protector-strong を使用
# コアダンプの無効化
echo "* hard core 0" | sudo tee -a /etc/security/limits.conf
DNS ハイジャックへの防御
# /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
DNSOverTLS=opportunistic
DNSSEC=allow-downgrade
Cache=yes
CacheFromNetwork=no
セキュリティ強化チェックリスト
| カテゴリ | チェック項目 | ステータス |
|---|---|---|
| SSH | パスワード認証の無効化 | ☐ |
| SSH | root ログインの無効化 | ☐ |
| SSH | デフォルトポートの変更 | ☐ |
| SSH | fail2ban の設定 | ☐ |
| SSH | 強力な暗号アルゴリズムの使用 | ☐ |
| ファイアウォール | デフォルトで着信を拒否 | ☐ |
| ファイアウォール | 必要なポートのみ開放 | ☐ |
| ファイアウォール | 発信ルールの制限 | ☐ |
| ユーザー | 不要なアカウントの削除 | ☐ |
| ユーザー | 最小権限 sudo の設定 | ☐ |
| ユーザー | パスワード複雑性ポリシー | ☐ |
| ユーザー | アカウントロックアウトポリシー | ☐ |
| ファイルシステム | 重要ファイルの権限が正しい | ☐ |
| ファイルシステム | 不変属性の設定 | ☐ |
| ファイルシステム | 機密パーティションの暗号化 | ☐ |
| カーネル | IPフォワーディングの無効化 | ☐ |
| カーネル | SYN Cookies の有効化 | ☐ |
| カーネル | ASLR の有効化 | ☐ |
| 監査 | auditd ルールの設定 | ☐ |
| ログ | ログの永続化 | ☐ |
| ログ | 集中ログ収集 | ☐ |
| アップデート | 自動セキュリティアップデート | ☐ |
| 侵入検知 | AIDE ベースラインの構築 | ☐ |
| 侵入検知 | rkhunter の定期スキャン | ☐ |
| SSL/TLS | 弱プロトコルの無効化 | ☐ |
| SSL/TLS | HSTS の有効化 | ☐ |
よくある質問(FAQ)
Q: 強化後に SSH ログインできなくなったら?
パスワード認証を無効化する前に、公開鍵のデプロイと鍵認証のテストが完了していることを確認してください。別のターミナルで新しい設定をテストしながら、アクティブなセッションを維持することをお勧めします。ロックアウトされた場合は、クラウドプロバイダーの VNC コンソールからログインして修復できます。
Q: SSH ポート変更後に接続できなくなったら?
ファイアウォールが新しいポートを許可しているか確認してください。UFW と iptables の両方でルールを同期更新する必要があります。また、SELinux/AppArmor が新しいポートを許可しているか確認してください(RHEL/CentOS の場合: semanage port -a -t ssh_port_t -p tcp 2222)。
Q: chattr +i 後にファイルを変更できなくなったら?
chattr -i で不変属性を解除し、変更後に再度 chattr +i で設定し直してください。注意:root も不変属性をバイパスできません。まず解除する必要があります。
Q: 自動セキュリティアップデートでサービスが中断しますか?
セキュリティアップデートは通常サービスを再起動せず、パッチのみ適用します。ただし、カーネルアップデートは再起動が必要です。Automatic-Reboot "false" を設定し、手動で再起動の時間を調整することをお勧めします。
Q: 本番環境に影響を与えずに強化措置をテストするには?
- テスト環境で全設定を事前検証
- ブルーグリーンデプロイメントまたはカナリアリリースで段階的に適用
- ロールバック計画を維持(全設定ファイルをバックアップ)
- 段階的強化:まず SSH → 次にファイアウォール → 次にカーネルパラメータ
Q: AIDE が大量の変更を報告したらどうすればいいですか?
変更が正当な操作(パッケージ更新、設定変更など)によるものか確認してください。正当な変更後は AIDE データベースを更新する必要があります。不正な変更の場合は、直ちにインシデント対応プロセスを開始してください。
本記事の強化措置は、実際のビジネス要件に応じて調整できます。より詳細なコンプライアンス基準については CIS Benchmarks と DISA STIG を参照してください。ToolsKu のハッシュ暗号化ツール と SSH 鍵ジェネレーター を活用すると、サーバーセキュリティ強化をより効率的に行えます。
ブラウザローカルツールを無料で試す →