1. IORI-ST
  2. web
  3. sshのセキュリティ入門

sshのセキュリティ入門

サーバーサイドに苦手意識を持っているwebデザイナーさんは少なくないと思います。かくいう私もそのうちの一人でしたが、先日思い立って2週間お試しVPSを契約し、サーバー構築に初挑戦してみました。

その際に参考にしたのが、さくらのナレッジの「ネコでもわかる!さくらのVPS講座 〜第一回:VPSてなんだろう?〜」の連載。具体的な作業の流れだけでなく、仕組みなどが図解つきで説明されているため、非エンジニアの私にとっても非常にわかりやすい記事でした。しかし唯一sshのセキュリティの設定については詳細が別リンクになっていたので、今回はこの部分について自分なりにまとめてみます。


sshで最低限のやっておきたいセキュリティ項目


sshのセキュリティ項目は多くあるのですが、その中でも最低限設定しておきたいものは以下の3つです。


  • rootユーザのログインを禁止する
  • ポート番号を変更する
  • ログイン方法をパスワードから公開鍵認証へ切り替える

尚、本編の操作はMacのターミナルを、OSはCentOS7を想定して説明しています。


rootユーザのログインを禁止する


VPSへの一番初めのログインは「root」というユーザーで行います。このrootはサーバーの管理に対して最高権限を持っているため、万が一パスワードなどが盗まれるとサーバーが乗っ取られてしまう危険性も。それを防ぐために、まずはログイン用の一般ユーザーを作成し、悪意のある部外者が直接rootでログインできないようにします。


  1. 一般のユーザーを作る
  2. 一般ユーザーからrootへ切り替える方法を覚える
  3. rootの直接ログインを禁止する

一般ユーザーを作る


今回は一般ユーザーを「admin」という名前で作っていきます。その前にまずはrootでログインしましょう。123.123.123.123の部分はVPSのIPアドレスです。


$ ssh root@123.123.123.123

ログインしたら以下のコマンドを打ち込み、adminユーザーを新規追加しましょう。


# adduser admin

adminユーザーのパスワードも設定します。rootユーザーとは異なる文字列で作成しましょう。New password: と表示されたら、新しいパスワードを入力してください。


# passwd admin

以上でadminユーザーが作成できました。


ここで正常に作成されているか確かめるために、一度新しく作成したadminでログインしてみます。現在のrootからのログアウトは、以下のコマンドで行えます。


# exit

sshへのログイン方法はrootの時と変わりません。「ssh」と記入した後に「ユーザー名@IPアドレス」と続きます。続いてアカウント作成時に設定したパスワードが聞かれるので、こちらも同じ手順で入力していきます。


$ ssh admin@123.123.123.123

正常にログインできると、以下のようにユーザーが「admin」、コマンドプロンプトが「$」と表記されます。


[admin@xxx-xxx-xxxxx ~]$

一般ユーザーからrootへ切り替える方法を覚える


rootユーザのログインを禁止した後は、もちろん真の管理者である私たちもrootでログインすることはできなくなります。そのためサーバーの管理設定を編集する際は、一度一般ユーザーで入り、その後にrootへ切り替えるという手順を踏まなければいけません。rootの直接ログインを禁止する前に、まずは一般ユーザーとrootを行き来して切替に慣れましょう。


adminからrootへ切り替えるには、以下の「su -」コマンドを入力します。続けてパスワードが聞かれるので、ここでrootのパスワードを入力しましょう。正常にログインできると、#記号のコマンドプロンプトが表示されます。


$ su -
[root@xxx-xxx-xxxxx ~]#

rootからadminへの切り替えは、adminのログアウトと同様に「exit」を使います。


# exit


rootの直接ログインを禁止する


直接ログインの禁止はsshサーバーの設定ファイルを編集して行います。これはサーバーの管理行動になるので、rootユーザーにしか行えません。まずはrootにログインしている状態で、作業ファイル「sshd_config」のバックアップをとっておきます。


# cd /etc/ssh
# cp sshd_config sshd_config.old

1行目で /etc/ssh のディレクトリに移動し、2行目で「sshd_config」というファイルをコピーして「sshd_config.old」というファイルを作成します。これで万が一「sshd_config」内でミスをしたとしても「sshd_config.old」に初期設定がとってあるため安心して作業を行うことができます。


ちなみに以下のコマンドを打つとディレクトリ内のファイル一覧が確認できるため、「sshd_config.old」が正常に作成されているか確かめる際に利用してみてください。


# ls

それでは「sshd_config」を編集していきます。ファイルの編集はVPSに標準でインストールされているvimエディタで行います。


# vim sshd_config

ファイル内の以下の「PermitRootLogin」が「rootでログインする設定」です。初期設定では「yes」で有効になっているので、「no」へ書き換えて無効にします。また「#」によるコメントアウトも削除します。(※以下のソースで書いてある「+」「-」は変更前・変更後の表記のため、実際にうつコマンドには含まれません。)


+ #PermitRootLogin yes
- PermitRootLogin no

編集後は以下のコマンドを入力してsshサーバーであるsshdを再起動すると、編集した設定が有効になります。


# systemctl restart sshd.service

ポート番号を変更する


ssh,http,httpsなどそれぞれのサービスが持つ固有の番号を「ポート番号」と言います。それぞれのポート番号は、例えば「sshによる通信がしたい!」という場合は22番を通ることで通信が許可されるといった形で、まるで飛行機の搭乗口のように整理されています。


サービス名プロトコルとポート番号
ssh/sftpTCP 80
httpTCP 80
httpsTCP 443

しかしこの初期値22のポート番号は広く知られているため、攻撃の対象になりかねません。そのため1024 〜 65535 までの任意の番号へ変えておくのが一般的です。今回は例として「2222」へ変更していきましょう。


  1. /etc/ssh/sshd_configの設定を変更する
  2. firewalldの設定を変更する

sshd_configの設定を変更する


rootでログインして、/etc/ssh/sshd_configのファイルを以下のように編集し、sshdを再起動して編集箇所を有効にします。


- # Port 22
+ Port 2222

# systemctl restart sshd.service

firewalldの設定を変更する


firewalld(ファイアウォールディー)とは、ファイアウォールの設定を行うためのツールです。ファイヤーウォールはサービス通信時の「防火壁」としての役目を持ち、先ほどの飛行機の搭乗口の例でいう「審査」に似ています。現在はsshのポート22が有効になっているため通信が許可されていますが、これを無効にし、ポート2222を有効にするよう切り替えていきます。


まずはファイアウォールが起動中かどうかを確認してみましょう。firewalldで使うコマンドはfirewall-cmdです。rootでログインした状態のまま以下のコマンドを入力し、実行結果がrunningなら起動中、not runningなら停止中になります。


# firewall-cmd --state
running

またファイアウォール設定の確認は以下のコマンドで行えます。「services:」と書かれている項目が有効になっているサービスで、下の例では「ssh」と「dhcpv6-client」が有効になっています。(※dhcpv6-clientはこのまま有効にしておきましょう。)


# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

ここに「ssh-2222」を追加します。まずは既存の「ssh.xml」をコピーしてssh-2222.xmlを作成しましょう。


# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-2222.xml

次にvimエディタでssh-222.xmlファイルに書かれているポート番号を22から2222に変更します。


# vim /etc/firewalld/services/ssh-2222.xml

-  <port protocol="tcp" port="22"/>
+  <port protocol="tcp" port="2222"/>

変更後は、以下のコマンドでファイヤーウォールの設定にssh-2222を追加します。「success」と表示されれば成功です。


# firewall-cmd --permanent --add-service=ssh-2222
success

sshdの再起動と同様に、ファイヤーウォールを再起動して編集箇所を反映します。


# firewall-cmd --reload
success

再度ファイヤーウォールの設定を確認し、「services:」と書かれている項目に以下のように「ssh-2222」が追加されていれば、ポート2222は有効になっています。


# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources: 
 services: ssh dhcpv6-client ssh-2222
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 source-ports: 
 icmp-blocks: 
 rich rules: 

この状態が確認できたら、ポート22を使用する初期値のsshは無効にしてしても大丈夫です。sshをサービスから削除するには、以下のコマンドを実行します。処理が成功したら、例のごとくリロードして反映しましょう。


firewall-cmd --permanent --remove-service=ssh
success

# firewall-cmd --reload

これでfirewalldの設定がポート22から2222に変更できました。


# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh-2222
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

以上でポート番号を変更する作業は完了です。


一度別ウィンドウでターミナルを開き、新規追加した2222のポートでログインができるか確かめましょう。ポート番号でのログインは、通常ログイン「ssh admin@123.123.123.123」内に、「-p(ポート番号) 2222」を指定した以下のコマンドで行います。通常ログイン同様、adminのパスワードを求められたら成功です。


$ ssh -p 2222 admin@123.123.123.123
[admin@xxx-xxx-xxxxx ~]$

これ以降は以前までの通常ログインは使用できなくなるため、上記のコマンドを実行してadminにログインすることになります。打つコマンドは少し長くなりますが、すべての設定が終わった際に短いものに変更していく予定なので、少しの間頑張りましょう。ついでにポート22ではログインできないことも確認しておくと安心ですね。


$ ssh -p 22 admin@123.123.123.123
ssh: connect to host 123.123.123.123 port 22: Operation timed out

ログイン方法をパスワードから公開鍵認証へ切り替える


現段階では、sshのポート番号とadminのパスワードがわかればどのパソコンからもログインできてしまいます。これを真の管理者のパソコンからしかアクセスできないようにするのが、鍵認証方式です。



鍵認証方式では、パソコン側に置く「秘密鍵」とサーバー側に置く「公開鍵」の2つの鍵を用意します。ログイン時にはこの2つの鍵の型を照合し、さらにadminのパスワードとは異なるパスフレーズを入力して、アクセスするユーザーが悪意な部外者でないことを確かめます。


まずはログインに使うパソコンの方で2つの鍵を作ります。ターミナルを別ウィンドウで開き、sshにログインしない状態で以下のコマンドを入力してください。mkdirでホームディレクトリ内に.sshというフォルダを作成し、chmod 700でディレクトリのアクセス権限を本人しか読み書きできない権限に設定します。


$ mkdir .ssh
$ chmod 700 .ssh

その後.sshディレクトリに移動し、ssh-keygenコマンドを実行して秘密鍵と公開鍵のペアを作ります。最初に作成キーの名前を聞かれますが、今回はEnterを押して初期値を利用します。その後2回に渡り設定するパスフレーズを入力すると、鍵の作成が行われます。


$ cd .ssh
$ ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa): (リターン)
Enter passphrase (empty for no passphrase): (パスフレーズを入力してリターン)
Enter same passphrase again: (パスフレーズを入力してリターン)
Your identification has been saved in /Users/xxxx/.ssh/id_rsa.
Your public key has been saved in /Users/xxxx/.ssh/id_rsa.pub.
The key fingerprint is:
93:b3:41:fe:3a:cb:ba:f3:6b:99:fe:6f:d4:21:dd:fb xxxx@local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        .    . . |
|       o .  . o .|
|        S    o ..|
|         *  . .. |
|        .o..    .|
|      ..=.  .   E|
|      oBB=.o.    |
+-----------------+

この後にlsで確認すると、「 id_rsa」と「id_rsa.pub」の2つのファイルが作成されています。id_rsa が秘密鍵ファイル、id_rsa.pub が公開鍵ファイルです。このうちid_rsa.pubについてcatで中身を開き、ファイル内の文字列を別のクリップボードなどにコピーして控えておきます。


$ cat id_rsa.pub
ssh-rsa XXXXXX xxx@local (コピー)

次に、このコピーした内容をサーバー側で公開鍵として設定していきます。まずadminでsshにログインして、以下のコマンドで公開鍵を設置するフォルダを作成しましょう。パソコン側の設定と同様にmkdirでホームディレクトリ内に.sshというフォルダを作成し、chmod 700でディレクトリのアクセス権限を本人しか読み書きできない権限に設定します。さらに.sshディレクトリに移動し、「authorized_keys」というファイルを作成します。


$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ vim authorized_keys

この「authorized_keys」のなかに先ほどコピーした文字列を貼り付け保存し、最後にchmod 600でファイルのアクセス権限を自分のみ読み書き可能に設定します。


$ chmod 600 authorized_keys

以上で公開鍵の設定は完了です。鍵認証でのログイン確認を行うにあたって、パソコン側にあるid_rsa.pubは削除しておきます。ログイン確認は本来ならば下のコマンドで行うのですが、このままだとポート22に接続しようとするためポート番号を変更した後だとうまくタイムアウトして上手く接続できません。


$ ssh -i .ssh/id_rsa admin@xxx.xxx.xxx.xxx

そこで、再度別ウィンドウでターミナルを開き、パソコン側の.sshに新しいログイン方法を設定します。設定ファイルは.ssh/configです。


$ cd .ssh

$ vim config
Host admin (任意の接続名)
    HostName 123.123.123
    User admin (ユーザー名)
    Port 2222
    IdentityFile .ssh/id_rsa(秘密鍵へのパス)

この設定が完了したら、以降のログインは以下のコマンドで行えます。正常に実行されるとパスフレーズを聞かれるので、ユーザーのパスワードではなく鍵作成時に設定したパスフレーズを入力してください。


ssh hoge(任意の接続名)

ログインができることを確認したら、最後にパスワードでのログインを無効にします。ユーザーを最高管理権限を持つrootに切り替え、sshd_configの設定を編集しましょう。


$ su -
# cd /etc/ssh
# vim sshd_config

sshd_configの「PasswordAuthentication」と書かれている項目がパスワードによるログインの設定になります。yesで有効になっている部分をnoと書き換え無効にすれば完了です。


- PasswordAuthentication yes
+ PasswordAuthentication no