こんにちはjunです。webエンジニアとして働いていますが会社の人数が少なく、インフラの構築をすることがあります。と言ってもLAMP環境を作成するぐらいですけど。
構築は慣れてきましたがその中で、私が一番考えるのはセキュリティーです。構築するアプリケーションによってはセキュリティー設定はことなりますが、今回は自分でサーバを構築する時に最低限やった方がいいSSHの設定をメモがてら記事にしようと思います。
今回行う設定は以下の通りです。
この設定をすべき理由や背景などから話すため、さっさと方法を知りたい場合は「root以外のユーザーを作成していく」から見てください。
SSHはリモートでサーバーを操作できる口のため、一番厳重にしなければなりません。あまり運用していないサーバー、購入したばかりでドメインと紐づけられていなくても世界中からBOTによる不正アクセス試行が発生します。私がVPSで購入してイメージが立った時も早速ログを見たところ以下の様になっていました。
April 8 12:10:04 xxx-xxx-xx-xxx sshd[6887]: Failed password for root from 209.141.36.197 port 54506 ssh2
April 8 12:10:04 xxx-xxx-xx-xxx sshd[6891]: Failed password for invalid user oracle from 209.141.36.197 port 54518 ssh2
April 8 12:10:04 xxx-xxx-xx-xxx sshd[6892]: Failed password for invalid user test from 209.141.36.197 port 54512 ssh2
April 8 12:10:04 xxx-xxx-xx-xxx sshd[6889]: Failed password for root from 209.141.36.197 port 54520 ssh2
April 8 12:10:06 xxx-xxx-xx-xxx sshd[6904]: Failed password for root from 222.187.238.136 port 58496 ssh2
April 8 12:10:10 xxx-xxx-xx-xxx sshd[6904]: Failed password for root from 222.187.238.136 port 58496 ssh2
April 8 12:16:26 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2
April 8 12:16:30 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2
April 8 12:16:33 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2
April 8 12:16:37 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2
April 8 12:16:41 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2
April 8 12:16:45 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2
April 8 12:16:49 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2
April 8 12:16:53 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2
April 8 12:16:56 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2
April 8 12:27:50 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2
April 8 12:27:54 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2
April 8 12:27:57 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2
これはSSHの接続失敗の履歴です、同じIPで定間隔でrootユーザーによるパスワード接続を試みています。これはパスワードリスト攻撃・総当たり攻撃というものです。確率は低いですがrootのパスワードが万が一にあった場合、サーバの最上権限であるrootが第三者に掌握されます。
ドメインに紐づけられておらずIPだけでもこの様にBOTがインターネットを徘徊して、脆弱なサーバを狙っています。VPSを購入したらすぐにデフォルトの設定を変えて、比較的安全なものに変更しましょう。
whois
コマンドを使用してIPのwois情報を調べられます。登録された国などもわかります。ちなみに上記のIPのほとんどが中国でした。
デフォルトの設定から以下の変更を行います。
これらの設定は最低限行うべきものです。より強固にする場合は、色々と他に設定しますがまずはこれでいきましょう。
最終的にはrootのリモートログインを禁止するため別の操作ユーザーを作成していきます。まずはrootでログインしましましょう。
ssh root@123.456.78.901
(IPなどは自分のものに置き換えてください)
開発用・SSH接続用ユーザーを作成します。
# useradd develop
# passwd develop
これでユーザーとそのパスワードが設定されました。次にそのユーザーをwheel
グループに所属させます。
# usermod -G wheel develop
wheel
グループに所属することでdevelop
がsudo
を使用できる様になり、またsu
にてrootになることができます。/etc/sudoers
ではwheel
グループで行える操作などを定義してあり、基本的にはrootを使用せずdevelopでsshログインをして操作します。yumで何かインストールしたい時とかはsudo
したりsu
でrootになります。
デフォルトではsuでどのユーザーもrootになれます。develop
意外にもユーザは存在し、そのユーザーが狙われることもあります。そのためwheel
グループに属しているユーザーだけがsu
を用いてrootになれる様にしましょう。
suの設定は/etc/pam.d/su
に記述されています。
# vi /etc/pam.d/su
--------
# コメントアウトしているこの箇所を外す
# auth required pam_wheel.so use_uid
↓
auth required pam_wheel.so use_uid
--------
コメントアウトされている箇所を外します。これでsuでrootになるためにwheelグループに属したユーザーから行うという制限ができました。
現在sshはパスワードでログインできますが、最終的にはパスワード認証を禁止にします。そしてよりセキュアな鍵認証式に変更します。基本的にログインの手間やセキュリティ的に鍵認証にした方がいいです。鍵認証の原理は今回は省きます。それではdevelop用の鍵を作成します。
クライアント側で秘密鍵と公開書きを作成します。
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/you/.ssh/id_rsa): #id_rsaというファイル名でよければそのままEnter
Enter passphrase (empty for no passphrase): #パースフレーズを設定する場合は入力。なければEnter
Enter same passphrase again:
これで秘密鍵と公開鍵が生成されます。秘密鍵をクライアントに置いておき、公開鍵をサーバに転送します。
scp ./id_rsa.pub develop@123.456.78.902:~/
サーバー側に戻ります。developのホームディレクトリに.ssh
というディレクトリがあるかを確認します。
$ ls -a ~/
.ssh
は隠しフォルダなのでls -a
を使用します。無い場合はディレクトリを作成します。今回は無かったとしましょう。
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
.ssh
は権限を700にしましょう。そうで無いと権限エラーによってdevelopに対するsshを行うことができません。そしてクライアントから転送された公開側の名前を変更して.ssh
配下に置いておきます。
$ cp ~/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub
ここでもauthorized_keys
は600権限を付けないと使用できません。
authorized_keysにリネームする理由
The authorized_keys file in SSH specifies the SSH keys that can be used for logging into the user account for which the file is configured.(参照)
authorized_keysファイルはその公開鍵に紐づく秘密鍵を用いてログインできるユーザーを特定します。簡単な話、authorized_keysにしておけばsshが自動的に鍵を判別してくれるのでその名前にしておく。
これでdevelopは鍵認証を用いてログインできる様になりました。
developで鍵認証で接続できることを確認したら次はrootのリモートログインとパスワード認証を禁止にします。/etc/ssh/sshd_config
を編集していきます。
# vi /etc/ssh/sshd_config
---------- 以下行を追加 -----------
PermitRootLogin no
---------- 以上行を追加 -----------
--------------以下を変更--------------
PasswordAuthentication yes
#RSAAuthentication yes
#PubkeyAuthentication yes
--------------↓--------------
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
------------------------------------------
PermitRootLogin no
という記述をつけます。名の通りルートのログインを禁止にさせました。そしてPasswordAuthentication no
としパスワード認証を禁止。RSAAuthentication yes
とPubkeyAuthentication yes
のコメントアウトを外して鍵認証のみでつなげる様に明示的に設定します。
これであとはsshdをリスタートさせれば反映させます。
# systemctl restart sshd
試しにチェックしましょう。
ssh root@xxx.xxx.xxx
root@xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
ssh develop@xxx.xxx.xxx
develop@xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
OKです。逆にdevelopで鍵認証で接続したのに弾かれたら設定をミスっています。
sshはデフォルトで22のポートで接続します。しかしこのポートはwell-knownポートとして知られており、攻撃者もデフォルトのポートを狙ってきます。そこでsshのポートを変更してさらに攻撃されにくくします。sshに接続するためにはユーザー名、鍵・パスワード、ポートが合わないといけないからです。
まずはsshdのデフォルトポートを変更します。変更するポート番号は49513~65535あたりから自由に設定しましょう。
# vi /etc/ssh/sshd_config
--------------以下を変更--------------
#Port 22
--------------↓--------------
Port 49510
------------------------------------------
そしてfirewallが有効な場合、sshによる22は許可していてもカスタムしたポートは許可していないことがあります。これではカスタムポートへ接続する前にfirewallで弾かれるので設定します。
まずはsshdのfirewallの設定ファイルをコピーします。
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
/etc/firewalld/services/
にて追加の設定を行うことができます。コピーしたssh.xml
を編集します。
# vi /etc/firewalld/services/
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol ...</description>
<port protocol="tcp" port="22"/>
<port protocol="tcp" port="49510"/> # 追加
</service>
上記の設定でsshサービスによる49510ポートの接続が許可されました。 そして設定が終わったらfirewallをリロードします。またsshdも設定を変えたのでリロードします。
# firewall-cmd --reload
# systemctl restart sshd
これでOKです。ポートをカスタムのものに指定して接続して通れば問題ありません。そして22(デフォルト)で接続して弾かれるかも確認しましょう。
以上がsshの最低限必要な設定です。インフラ系では結構基礎的な内容だそうです。sshは狙われており、適切に設定することで安全に使用することができます。