CentOS7を安全に運用する為の初期設定
CentOS7インストール直後の初期設定とセキュリティ対策した時のメモ
SSH(22/TCP)でサーバにログイン(ユーザ名は「root」、パスワードは OSインストール時に設定したもの)
yumアップデート
# yum clean all # yum -y update
IPv6の無効化
/etc/sysctl.conf
変更前にバックアップ
# cp -p /etc/sysctl.conf /etc/sysctl.conf_`date "+%Y%m%d%H%M%S"`
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
/etc/hosts
変更前にバックアップ
# cp -p /etc/hosts /etc/hosts_`date "+%Y%m%d%H%M%S"`
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ↓ #::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
SELinuxの無効化
/etc/sysconfig/selinux
変更前にバックアップ
# cp -p /etc/sysconfig/selinux /etc/sysconfig/selinux_`date "+%Y%m%d%H%M%S"`
SELINUX=enforcing ↓ SELINUX=disabled
一度、サーバの再起動
# shutdown -r now
現在のロケール(locale)の確認・変更
ロケール(locale)の確認 # localectl status System Locale: LANG=en_US.UTF-8 VC Keymap: jp106 X11 Layout: jp 使用可能なロケール(locale)の一覧 # localectl list-locales | grep -i ja ja_JP ja_JP.eucjp ja_JP.ujis ja_JP.utf8 japanese japanese.euc ロケール(locale)の変更 # localectl set-locale LANG=ja_JP.utf8 変更内容を即時反映 # source /etc/locale.conf
タイムゾーン確認
Asia/Tokyoになっていることを確認 # timedatectl Local time: 金 2019-11-08 18:22:37 JST Universal time: 金 2019-11-08 09:22:37 UTC RTC time: 金 2019-11-08 09:22:36 Time zone: Asia/Tokyo (JST, +0900) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a
Chrony(NTP)
/etc/chrony.conf
変更前にバックアップ
# cp -p /etc/chrony.conf /etc/chrony.conf_`date "+%Y%m%d%H%M%S"`
server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst ↓ #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst server ntp1.sakura.ad.jp iburst
Chronyを再起動
# systemctl restart chronyd.service
・動作確認 (10分後に確認) # chronyc sources 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* ntp1.sakura.ad.jp 2 10 377 86 +18us[ +27us] +/- 1078us
現在のシステム日時を確認 # date 2019年 11月 8日 金曜日 18:32:24 JST
一般ユーザの作成
ユーザ作成 # useradd test_user パスワード設定 # passwd test_user 新しいパスワード: [パスワード]
ユーザーをwheelグループに追加
# gpasswd -a test_user wheel
# visudo
コメントをはずす # %wheel ALL=(ALL) ALL ↓ %wheel ALL=(ALL) ALL
root権限に切り替えられるユーザーを制限する
# vi /etc/pam.d/su
コメントをはずす #auth required pam_wheel.so use_uid ↓ auth required pam_wheel.so use_uid
公開鍵と秘密鍵の生成
作成するユーザに切り替え後、処理を実行 # su - test_user $ mkdir .ssh $ chmod 700 .ssh $ cd .ssh/ $ ssh-keygen -t rsa -b 4096 -C "test_user@example.com" Enter file in which to save the key (/home/test_user/.ssh/id_rsa): [Enter] Enter passphrase (empty for no passphrase): [パスワード入力][Enter] Enter same passphrase again: [パスワード再入力][Enter]
$ mv id_rsa.pub authorized_keys $ chmod 600 authorized_keys id_rsaのデータをコピー&ペーストでローカルpc(C:\ssh\id_rsa)に保存 $ cat id_rsa -----BEGIN RSA PRIVATE KEY----- ...省略 -----END RSA PRIVATE KEY----- ファイルを削除 $ rm id_rsa rootに戻る $ exit
SSHの設定
/etc/ssh/sshd_config
変更前にバックアップ
# cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_`date "+%Y%m%d%H%M%S"`
・待ち受けポート番号の変更 #Port 22 ↓ Port 10022 ・IPv4のみ接続 #AddressFamily any ↓ AddressFamily inet ・SSH2のみ許可 (7.4から削除されている) #Protocol 2 ↓ Protocol 2 ・SSH接続認証の制限時間を短くする #LoginGraceTime 2m (デフォルトは120秒) ↓ LoginGraceTime 50 ・rootでのログインを禁止 #PermitRootLogin yes ↓ PermitRootLogin no ・公開鍵認証を許可 #PubkeyAuthentication yes ↓ PubkeyAuthentication yes ・空のパスワードの禁止 #PermitEmptyPasswords no ↓ PermitEmptyPasswords no ・パスワード認証不可 #PasswordAuthentication yes ↓ PasswordAuthentication no ・チャレンジ・レスポンス認証不可 #ChallengeResponseAuthentication yes ↓ ChallengeResponseAuthentication no ・GSSAPIベースのユーザ認証不可 #GSSAPIAuthentication yes ↓ GSSAPIAuthentication no ・名前解決をしないように設定 #UseDNS yes ↓ UseDNS no
SSHの再起動
# systemctl restart sshd.service
SSHの状態確認
# systemctl status sshd.service
※エラーがある場合、サービスが起動せずSSHが使えなくなるので注意してください。
ファイアウォール設定
RHEL/CentOS7系からOSのファイアウォールはiptablesからfirewalldへと変更されていますが、使いなれているiptablesを使用します。
iptablesインストール
# yum -y install iptables-services
firewalldの停止
# systemctl stop firewalld.service # systemctl disable firewalld.service
iptablesを起動
# systemctl start iptables.service
iptablesの自動起動の設定
# systemctl enable iptables.service
iptablesの設定
/etc/sysconfig/iptables
変更前にバックアップ
# cp -p /etc/sysconfig/iptables /etc/sysconfig/iptables_`date "+%Y%m%d%H%M%S"`
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # 確立済みの通信は許可 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 自ホストからの通信は全て許可 -A INPUT -i lo -j ACCEPT # pingは許可(1秒間に1回の制限) -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT # プライベートアドレスを破棄 -A INPUT -s 10.0.0.0/8 -j DROP -A INPUT -s 172.16.0.0/12 -j DROP -A INPUT -s 192.168.0.0/16 -j DROP # ローカルループバックアドレスを破棄 -A INPUT -s 127.0.0.0/8 -j DROP # リンクローカルアドレスを破棄 -A INPUT -s 169.254.0.0/16 -j DROP # テストネットワークアドレスを破棄 -A INPUT -s 192.0.2.0/24 -j DROP -A INPUT -s 198.51.100.0/24 -j DROP -A INPUT -s 203.0.113.0/24 -j DROP # クラスDを破棄 -A INPUT -s 224.0.0.0/4 -j DROP # クラスEを破棄 -A INPUT -s 240.0.0.0/4 -j DROP # Current networkを破棄 -A INPUT -d 0.0.0.0/8 -j DROP # ブロードキャストアドレスを破棄 -A INPUT -d 255.255.255.255 -j DROP # データを持たないパケットを破棄 -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # SYNフラッド攻撃と思われる接続を破棄 -A INPUT -p tcp -m state --state NEW ! --syn -j DROP # ステルススキャン攻撃と思われる接続を破棄 -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # フラグメントパケット攻撃と思われる接続を破棄 -A INPUT -f -j DROP # ssh :SSH - [0:0] :SSH_ATTACK - [0:0] # -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT # 同じホストから60秒以内に5回のSSH接続があったら、そのホストからのSSH接続を10分間受け付けない -A INPUT -p tcp -m state --state NEW -m tcp --dport 10022 -j SSH -A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT -A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSH_ATTACK -A SSH -m recent --name sshcon --set -A SSH -j ACCEPT -A SSH_ATTACK -m recent --name sshbadcon --set -A SSH_ATTACK -j LOG --log-prefix "iptables:SSH_ATTACK: " -A SSH_ATTACK -j REJECT -A INPUT -j LOG --log-prefix "iptables:" --log-level=warning -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
iptablesの再起動
# systemctl restart iptables.service
iptablesの状態確認
# systemctl status iptables.service
※必ず起動していることを確認してください。
最後に
1、rootでログインできないことを確認
2、作成した一般ユーザで10022番のポートを使用して公開鍵認証ができることを確認