システム環境の確認
最適化を開始する前に、現在のOSバージョンとカーネル情報を確認します。
cat /etc/redhat-release
uname -a
以下に、新規サーバー構築時に推奨される主要な設定項目とセキュリティ対策の概要を示します。
- rootアカウントによる直接ログインを禁止し、一般ユーザーによるsudo運用を徹底する
- SSHデーモンのデフォルトポート(22)を変更し、rootユーザーのリモート接続を制限する
- NTPを使用してサーバー時刻を自動同期し、正確な時刻管理を行う
- パッケージ管理のyumリポジトリを国内ミラー(Alibaba Cloudなど)に切り替える
- 不要なSELinux機能を無効化する
- ログファイルの定期的な自動ローテーションと削除設定を行う
- プロセスが使用できるファイルディスクリプタ数の上限を引き上げる
- システム起動時のサービスを精簡し、必要なもののみを有効化する
- カーネルパラメータ(/etc/sysctl.conf)をチューニングしてネットワーク性能を向上させる
- システムロケールを「ja_JP.UTF-8」または「zh_CN.UTF-8」に設定し、文字化けを防ぐ
- 重要なシステム設定ファイルに変更不可属性(chattr)を付与して保護する
- ログイン画面のバナー情報(/etc/issue等)を削除して情報漏洩を防ぐ
- ICMPパケット(ping)への応答を拒否してサーバーの存在を隠蔽する
- 既知の脆弱性に対してパッチ適用やアップデートを行う
rootユーザーログインの禁止とsudoの設定
まず、管理用の一般ユーザーを作成し、パスワードを設定します。
/usr/sbin/useradd sysadmin
/usr/bin/passwd sysadmin
次に、sudoersファイルを編集して、作成したユーザーに管理者権限を付与します。パスワードなしでsudoを実行できるように設定する例を示します。
visudo
# 設定ファイル内に以下の行を追加
sysadmin ALL=(ALL) NOPASSWD: ALL
設定後、rootディレクトリへのアクセス権限がないことを確認し、sudoを使用してアクセスできることをテストします。
su - sysadmin
ls /root/
sudo ls /root/
SSHポートの変更とファイアウォール設定
SSHのポート番号をデフォルトの22から22222などに変更し、セキュリティを強化します。設定ファイルを編集し、ファイアウォール(iptables)で新しいポートを許可します。
sed -i 's/#Port 22/Port 22222/' /etc/ssh/sshd_config
# ファイアウォールの設定を追加
/sbin/iptables -I INPUT -p tcp --dport 22222 -j ACCEPT
/etc/init.d/iptables save
# 古い22番ポートのルールを削除
sed -i '/dport 22 -j ACCEPT/d' /etc/sysconfig/iptables
service iptables restart
service sshd restart
時刻同期の設定
ntpdateコマンドを使用して時刻を同期させ、定期実行するようcrontabに登録します。
/usr/sbin/ntpdate ntp1.aliyun.com
定期タスクの設定例です。毎日午前2時に時刻同期を行います。
crontab -e
# 以下の行を追加
0 2 * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
Yumリポジトリの変更とEPELの追加
デフォルトのリポジトリをAlibaba Cloudのミラーに変更し、EPELリポジトリを追加します。
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum makecache
SELinuxの無効化
SELinuxを無効にするには、設定ファイルを書き換えます。
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 即座に反映させる場合(再起動推奨)
setenforce 0
ログの自動削除設定
ディスク容量を圧迫しないよう、古いログファイルを削除するスクリプトを作成します。ここでは30日以上前のログを削除するスクリプト例を示します。
vim /opt/scripts/auto_clean_logs.sh
#!/bin/bash
# 指定されたディレクトリ内の30日以上前のログを削除
TARGET_DIR="/var/log/apps"
find "$TARGET_DIR" -type f -name "*.log" -mtime +30 -delete
複数のディレクトリを管理するメインスクリプトを作成します。
vim /opt/scripts/batch_clean_logs.sh
#!/bin/bash
/opt/scripts/auto_clean_logs.sh
# 必要に応じて他のディレクトリも追加
# /opt/scripts/auto_clean_logs.sh /another/path
スクリプトに実行権限を与え、crontabに登録します。
chmod +x /opt/scripts/*.sh
crontab -e
# 毎週土曜日の深夜0:10に実行
10 0 * * 6 /opt/scripts/batch_clean_logs.sh
ファイルディスクリプタ数の上限緩和
同時に開けるファイル数の上限を増やし、高負荷時のエラーを防ぎます。
cp /etc/security/limits.conf /etc/security/limits.conf.bak
echo '* - nofile 65535' >> /etc/security/limits.conf
# 設定反映には再ログインが必要
ulimit -n
不要なサービスの停止
システム起動時に自動起動するサービスを精簡します。必要最低限のサービス(network, sshd, rsyslog, crond, sysstatなど)のみを残し、他はオフにします。
for service in $(chkconfig --list | awk '{print $1}' | grep -vE 'network|sshd|rsyslog|crond|sysstat'); do
chkconfig $service off
done
chkconfig --list | grep 3:on
カーネルパラメータの最適化
ネットワーク性能やセキュリティを向上させるために、カーネルパラメータを調整します。
cp /etc/sysctl.conf /etc/sysctl.conf.bak
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
EOF
sysctl -p</code>
システム文字コードの設定
システムの文字コードをUTF-8に設定し、日本語や中国語などのマルチバイト文字が正しく表示されるようにします。
vim /etc/profile
# 以下を追加
export LANG="zh_CN.UTF-8"
source /etc/profile
重要システムファイルの保護
ユーザー情報やグループ情報が含まれる重要ファイルに対して、変更不可属性(immutable)を設定し、誤操作や不正な書き換えを防ぎます。
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab
# 属性変更コマンド自体を別の場所に移動して隠す(防御策の一例)
mv /usr/bin/chattr /root/.bin/chattr_backup
mv /usr/bin/lsattr /root/.bin/lsattr_backup
ログインバナー情報の消去
SSHログイン時に表示されるOSバージョン情報などを削除し、攻撃者への情報提供を防ぎます。
echo "" > /etc/issue
echo "" > /etc/issue.net
Ping応答の禁止
サーバーがICMPパケット(Ping)に応答しないように設定します。
# Pingを無効化
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 再起動後も有効にする場合は /etc/sysctl.conf に以下を追記
# net.ipv4.icmp_echo_ignore_all = 1