VPSでやっておきたいSSHの最低限のセキュティ設定。
メモ セキュリティインフラネットワーク

VPSでやっておきたいSSHの最低限のセキュティ設定。

2021.04.25

こんにちはjunです。webエンジニアとして働いていますが会社の人数が少なく、インフラの構築をすることがあります。と言ってもLAMP環境を作成するぐらいですけど。

構築は慣れてきましたがその中で、私が一番考えるのはセキュリティーです。構築するアプリケーションによってはセキュリティー設定はことなりますが、今回は自分でサーバを構築する時に最低限やった方がいいSSHの設定をメモがてら記事にしようと思います。

今回行う設定は以下の通りです。

  • rootユーザーのリモートログイン禁止化
  • パスワード認証禁止と鍵認証化
  • 鍵認証の実装方法
  • ポート変更とfirewallの設定
なお今回説明する環境
  • サービス:GMO conoha VPS
  • OS:centos8

この設定をすべき理由や背景などから話すため、さっさと方法を知りたい場合は「root以外のユーザーを作成していく」から見てください。

SSHはめちゃくちゃ狙われている

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によるリモートログインを禁止にする。
  • SSHをパスワード認証でなく、鍵認証にする
  • ポートを変更する

これらの設定は最低限行うべきものです。より強固にする場合は、色々と他に設定しますがまずはこれでいきましょう。

root以外のユーザーを作成していく

最終的にはrootのリモートログインを禁止するため別の操作ユーザーを作成していきます。まずはrootでログインしましましょう。

ssh root@123.456.78.901
(IPなどは自分のものに置き換えてください)

開発用・SSH接続用ユーザーを作成します。

# useradd develop
# passwd develop

これでユーザーとそのパスワードが設定されました。次にそのユーザーをwheelグループに所属させます。

# usermod -G wheel develop

wheelグループに所属することでdevelopsudoを使用できる様になり、またsuにてrootになることができます。/etc/sudoersではwheelグループで行える操作などを定義してあり、基本的にはrootを使用せずdevelopでsshログインをして操作します。yumで何かインストールしたい時とかはsudoしたりsuでrootになります。

wheelのみがsuできる様にする

デフォルトでは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グループに属したユーザーから行うという制限ができました。

develop用のssh鍵を作成

現在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は鍵認証を用いてログインできる様になりました。

rootのリモートログインとパスワード認証を禁止にする

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 yesPubkeyAuthentication 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で鍵認証で接続したのに弾かれたら設定をミスっています。

接続系を設定するときは2つのターミナルタブを開いていておき、片方はずっとroot化できる状態でサーバーにログインしておき、片方で接続テストをしましょう。もし失敗してどのユーザー・方法でも接続できなくなると二度とサーバーに接続できなくなります。

sshの接続ポートを変更する

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は狙われており、適切に設定することで安全に使用することができます。

Copyright © 2021 jun. All rights reserved.