SSHのセキュリティ強化

2018年5月2日

前回の記事で初めてのVPSを借りたので,今回からは早速サーバをいじっていきたいと思います.

さくらのVPSではVNC(Virtual Network Computing)コンソールを利用することができるため,Webブラウザからサーバを操作することができます.ですが基本的にはターミナルからSSHを利用してサーバを遠隔操作するため,まずはSSH周りのセキュリティを強化していきたいと思います.

サーバ側:CentOS7
クライアント側:macOS High Sierra

SSH(Secure Shell)とは

暗号や認証の技術を利用して,安全にリモートコンピュータと通信するためのプロトコルです.

従来はリモートコンピュータとの通信にTelnetというプロトコルが利用されていました.しかし,このプロトコルは認証を含めたすべての通信を暗号化することなく平文のまま送信するためセキュリティ上推奨されていませんでした.そこで代替するプロトコルとして登場したのがSSHとなります.

SSHの特徴

  • パスワードやデータを暗号化して通信する.
  • クライアントがサーバに接続する際に,接続先が意図していないサーバに誘導されていないか厳密にチェックを行う.

簡単にまとめると”サーバへの安全な出入り口”のようなものです.

SSHの設定

早速SSHの設定を行っていきたいと思います.

公開鍵認証の導入

デフォルトの設定ではパスワード認証を用いてログインしますが,より安全な公開鍵認証方式を導入します.

クライアント側で鍵の生成

クライアント側で秘密鍵と公開鍵のペアを生成した後,公開鍵をサーバに転送します.

$ cd ~/.ssh/
$ ssh-keygen -t rsa -f hoge_rsa
$ scp ./hoge_rsa.pub user@host:~/.ssh

鍵の生成時,パスフレーズの入力を求められます.空のパスフレーズを設定することもできますし,その場合ログイン時にパスフレーズの入力を省くことができるため楽なのですが,パスフレーズは設定したほうがよりセキュリティが強固になるので私は設定しています.

サーバ側の鍵設定

.sshディレクトリとauthorized_keysファイルのパーミッションを正しく設定し,authorized_keysファイルにクライアントの公開鍵を登録します.

$ cd ~
$ chmod 700 .ssh
$ cd .ssh/
$ cat hoge_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ rm -f hoge_rsa.pub

設定ファイルの変更

次にサーバ側のSSHの設定ファイルを編集します.設定ファイルを編集するときは必ずバックアップを取っておきます.

# cd /etc/ssh/
# cp sshd_config sshd_config.org
# vim sshd_config

rootログインの禁止

管理者アカウントに直接ログインできてしまうと危険なので,rootユーザへのログインを禁止します.

#PermitRootLogin yes
↓
PermitRootLogin no

鍵認証の許可

先程導入した公開鍵でのログインを許可します.

#RSAAuthentication yes
#PubkeyAuthentication yes
↓
RSAAuthentication yes
PubkeyAuthentication yes

パスワードなしログインを禁止

空のパスワードでのログインを禁止します.

#PermitEmptyPasswords no
↓
PermitEmptyPasswords no

パスワード認証の禁止

鍵認証でのログインを行うので,パスワード認証でのログインを禁止します.

PasswordAuthentication yes
↓
PasswordAuthentication no

その他の設定

その他のセキュリティ上の設定を行います.

・SSHプロトコルバージョンをVersion 2に制限

#Protocol 2
↓
Protocol 2

・認証までの猶予時間を制限

#LoginGraceTime 2m
↓
LoginGraceTime 1m

・認証の試行回数を制限

#MaxAuthTries 6
↓
MaxAuthTries 6

・ケルベロス認証を禁止

#KerberosAuthentication no
↓
KerberosAuthentication no

・X11転送を禁止

X11Forwarding yes
↓
X11Forwarding no

・バナー非表示

#Banner none
↓
Banner none

ログイン可能なユーザの制限

ログインを許可するユーザを特定のユーザに制限します.

以下を設定ファイルの最後に追記
AllowUsers user

最後にサービスを再起動
# systemctl restart sshd

ポートの変更

次にSSH接続を行うポートを変更します.もちろんデフォルトの22番ポートでも正常に動作するのですが,22番ポートには様々な攻撃が飛んで来るので別のポートに設定します.今回は10022ポートに設定したいと思います.

SELinuxの設定

SELinuxのSSHが利用するポートに10022番ポートを追加しておきます.SELinuxは設定の面倒臭さから敬遠されがちですが,セキュリティのためにも有効にしておきましょう.

# yum install policycoreutils-python
# semanage port -a -t ssh_port_t -p tcp 10022
# semanage port -l | grep ssh
ssh_port_t                     tcp      10022, 22

ファイアウォールの設定

ファイアウォールの10022番ポートを開放し,22番ポートを閉鎖します.この時,作業の途中でログアウトするとログインできなくなってしまう可能性があるので,ログアウトしないように注意してください.

# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml
# vim /etc/firewalld/services/ssh-alt.xml
<port protocol="tcp" port="10022"/>

# firewall-cmd --permanent --add-service=ssh-alt
# firewall-cmd --permanent --remove-service=ssh
# firewall-cmd --reload
# firewall-cmd --list-all
        services: ssh-alt

SSHのポート変更

最後にSSHのポートを変更して完了となります.

# vim /etc/ssh/sshd_config

#Port 22
↓
Port 10022

最後にサービスを再起動
# systemctl restart sshd

エイリアスの設定

現在の設定だとサーバにログインするためにssh -p 10022 -i ~/.ssh/hoge_rsa user@xxx.xxx.xxx.xxxという非常に長いコマンドを入力する必要があります.そこでクライアント側の~/.ssh/configを設定することでオプションの入力を省略することができます.

$ vim ~/.ssh/config

Host hoge
        HostName xxx.xxx.xxx.xxx
        User user
        Port 10022
        IdentityFile ~/.ssh/hoge_rsa
        ServerAliveinterval 60

$ chmod 600 ~/.ssh/config
$ ssh hoge

おわりに

これでSSHのセキュリティ設定は以上になります.
できるだけセキュアになるように設定したつもりではありますが,他にもこうした方がいいなどのアドバイスがありましたら,ぜひコメント欄にコメントをお願いします.

参考文献

https://qiita.com/passol78/items/2ad123e39efeb1a5286b
https://qiita.com/tany3/items/7022d7225d07f7298c81