CentOS6及びCentOS7対象。レンタルサーバー等、外部に公開するサーバーに行う最低限の初期設定です。
詳しい人はもっと色々設定するかと思います。
色々なサイトを巡りながら作業しました。最初に参考にしたサイトは以下。
wheel グループを活用する – いますぐ実践! Linuxシステム管理 / Vol.104
CentOSをサーバーとして活用するための基本的な設定
他、色々です。
主に以下の対応を行っています。
ネットワーク(IPアドレスやゲートウェイ等)の設定は環境によって設定すべき内容がかなり違うので、今回省略しています。
①ユーザ作成 | 管理用ユーザを作成 |
②ユーザ管理設定 | wheelグループに追加、visudo設定等 |
③SSH設定 | ポート番号変更、rootログイン禁止 |
④パッケージ更新 | yumパッケージ更新 |
⑤ファイアウォール設定 | HTTP、HTTPS、SSHのみ許可 |
⑥鍵作成 | 秘密鍵/公開鍵作成、権限変更 |
⑦SSH設定 | 鍵認証のみ許可 |
⑧時刻設定 | chronyによる時刻同期 |
※注意事項
SSHやパスワードの設定を間違ったり、SSHポート番号、パスワードを忘れるとリモートログインできなくなります。VPS等であれば管理コンソールからログインするか、管理コンソール等がない場合は最悪サーバを初期化する羽目に陥ります。
私がやってしまった例は以下。
・ネットワーク環境(社内のルータ等)でポート22以外でSSH通信が拒否されていて、設定後にSSH接続できなくなった
・ネットワーク設定(CentOS6ならifcfg-eth0のONBOOT=yesがない、CentOS7ならnmtuiで設定するデバイスのAutomaticaly Connectが有効になっていない)で再起動後にネットワークが繋がらなくなった
さて、手順は以下です。
①ユーザ作成
管理用のユーザを作成します。
adduser ユーザーID passwd ユーザーID
※一定以上難解なパスワードとすること
②ユーザ管理設定
管理用ユーザをwheelグループ(sudo実行できるグループ)に追加します。
usermod -G wheel ユーザーID
wheelグループのみsudo可能に設定します。
visudo
以下を設定して保存。
%wheel ALL=(ALL) ALL
PAM(認証)を設定。
vi /etc/pam.d/su
以下を設定して保存。
auth required pam_wheel.so use_uid
※この設定以降、上記管理用ユーザ以外sudoが使えなくなる
③SSH設定
SSH設定を変更します。
vi /etc/ssh/sshd_config
以下を設定して保存。
PermitRootLogin no ... Port XXXX
※ポート番号(XXXX)はデフォルト22を使うと攻撃者にバレバレのため、適当なエフェメラルポートを割り当てる
※エフェメラルポートはファイル「/proc/sys/net/ipv4/ip_local_port_range」に書かれている(私の環境では32768 – 61000)
SSH再起動。
(1)CentOS6の場合
/etc/init.d/sshd restart
(2)CentOS7の場合
systemctl restart sshd.service
④パッケージ更新
yum update
⑤ファイアウォール設定
ファイアウォールはCentOS6ならiptablesで、CentOS7ならfirewalldで行うので、以下2パターンそれぞれ別手順を記載します。
(1)CentOS6の場合(iptables)
ファイアウォール設定はiptablesで行います。ping(ICMP)、HTTP、HTTPS、SSHを許可し、他の通信を拒否します。
localhostからの通信を許可。
iptables -A INPUT -i lo -j ACCEPT
ping許可。
iptables -A INPUT -p icmp -j ACCEPT
HTTP許可。
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
※”-m tcp”はパケットマッチングモジュール指定
HTTPS(SSL)許可。
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
SSH許可。
iptables -A INPUT -p tcp -m tcp --dport 11831 -j ACCEPT
ESTABLISHED(接続済みコネクションのパケット)とRELATED(接続済みコネクションに関連して発生した新たなコネクションパケット)を許可。
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
内向きの通信を拒否(上記設定以外)。
iptables -P INPUT DROP
外向きの通信を許可。
iptables -P OUTPUT ACCEPT
設定を保存。
service iptables save
設定を確認。
cat /etc/sysconfig/iptables
設定を確認(一覧)。
iptables -L
(2)CentOS7の場合(firewalld)
ファイアウォール設定はfirewalldで行います。HTTP、HTTPS、SSHを許可し、デフォルトのDHCPv6を含み他の通信を拒否します。firewalldはゾーンごとにサービス単位で通信可否が決まります。
firewalldが有効か確認。
systemctl list-unit-files | grep firewalld
※enabledが表示されれば有効状態なので、disabledの場合のみ以下コマンドで有効化
「systemctl enable firewalld.service」、「systemctl start firewalld.service」
ゾーン(現在の設定)を確認。
firewall-cmd --list-all
※publicゾーンのinterfacesとして通信に使用するNIC名が設定されていることを確認
全ゾーンの設定を確認。
firewall-cmd --list-all-zones
※使用しているNIC名がどのゾーンに配置されているかを確認
サービスを確認。
firewall-cmd --get-services
※sshが存在するか確認
SSHポートの確認。
sudo cat /usr/lib/firewalld/services/ssh.xml
※ポート番号が22(デフォルト)になっている事を確認
SSH用の設定を既存の流用で作成。
sudo cp -p /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml sudo vi /etc/firewalld/services/ssh-alt.xml
※ssh-altの方で、SSHのポート番号は先に設定したポート番号に変更して保存
設定(ssh-alt)の登録。
sudo firewall-cmd --reload firewall-cmd --get-services
※ssh-altが存在するか確認
ポート変更版SSHをpublicゾーンに追加。
sudo firewall-cmd --add-service=ssh-alt sudo firewall-cmd --permanent --add-service=ssh-alt
HTTPをpublicゾーンに追加。
sudo firewall-cmd --add-service=http sudo firewall-cmd --permanent --add-service=http
HTTPSをpublicゾーンに追加。
sudo firewall-cmd --add-service=https sudo firewall-cmd --permanent --add-service=https
SSH(元のデフォポート版)を削除。
firewalld-cmd --remove-service=ssh firewalld-cmd --permanent --remove-service=ssh
dhcpv6-client削除。
firewalld-cmd --permanent --remove-service=dhcpv6-client sudo firewall-cmd --reload
リロード後、サービス確認。
firewall-cmd --list-all
⑥鍵作成
セキュリティ向上のため、SSH通信時の認証をパスワードでなく鍵を使って行うようにします。あらかじめWinSCP等のFTPツールを用意しておきましょう。WinSCPの場合、SCP接続でポート番号はSSHのものを使います。
鍵を作成。
ssh-keygen -t rsa -b 2048 -C "任意のコメント" cd ~/.ssh cat id_rsa.pub >> authorized_keys chmod 600 ~/.ssh/authorized_keys
※コメントは適当で、パスフレーズはちゃんと控えましょう
※他の設定は問題なければそのままでもOK、鍵の名前を変更した場合は上記id_rsaやid_rsa.pubもあわせて変えて実行
秘密鍵をローカル(操作用マシン)にコピーします。FTPツールを使って「該当ユーザホームディレクトリ/.ssh/id_rsa」を取得します。
秘密鍵削除。
rm ~/.ssh/id_rsa
⑦SSH設定
SSH接続を鍵認証のみ許可し、パスワード認証を拒否するように設定します。
vi /etc/ssh/sshd_config
以下を設定して保存。
PasswordAuthentication no RSAAuthentication yes RhostRSAAuthentication no AllowUsers 作業ユーザ
SSH再起動。
(1)CentOS6の場合
/etc/init.d/sshd restart
(2)CentOS7の場合
systemctl restart sshd.service
⑧時刻設定
とりあえずCentOS7の設定のみ残します。CentOS6の場合はntpを設定すればよいので検索するとすぐ設定内容が見つかるかと思います。
chronyインストール。
yum install chrony
chronyインストール確認。
rpm -qa | grep chrony
ntp停止、サービス無効化。
systemctl stop ntpd.service systemctl disable ntpd.service
chronyサービス登録、起動。
systemctl enable chronyd.service systemctl start chronyd.service
chrony起動確認。
ps -ef | grep chrony
設定ファイル編集。
vi /etc/chrony.conf
以下を設定して保存。
# 既存のリストをコメントアウト、参照したいサーバを追記 #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 # iburstは起動直後にサーバに4回連続的に問い合わせることで時刻同期が早くなる server NTPサーバ iburst
※ntpは好きな場所を設定するとよいかと思います(検索すると色々ありますが、私はNICT、MFEED等を3つほど設定しました)
設定を確認。
systemctl status chronyd
以上です。
お疲れ様でした。