備忘録

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番のポートを使用して公開鍵認証ができることを確認