sshのセキュリティ入門
サーバーサイドに苦手意識を持っているwebデザイナーさんは少なくないと思います。かくいう私もそのうちの一人でしたが、先日思い立って2週間お試しVPSを契約し、サーバー構築に初挑戦してみました。
その際に参考にしたのが、さくらのナレッジの「ネコでもわかる!さくらのVPS講座 〜第一回:VPSてなんだろう?〜」の連載。具体的な作業の流れだけでなく、仕組みなどが図解つきで説明されているため、非エンジニアの私にとっても非常にわかりやすい記事でした。しかし唯一sshのセキュリティの設定については詳細が別リンクになっていたので、今回はこの部分について自分なりにまとめてみます。
sshで最低限のやっておきたいセキュリティ項目
sshのセキュリティ項目は多くあるのですが、その中でも最低限設定しておきたいものは以下の3つです。
- rootユーザのログインを禁止する
- ポート番号を変更する
- ログイン方法をパスワードから公開鍵認証へ切り替える
尚、本編の操作はMacのターミナルを、OSはCentOS7を想定して説明しています。
rootユーザのログインを禁止する
VPSへの一番初めのログインは「root」というユーザーで行います。このrootはサーバーの管理に対して最高権限を持っているため、万が一パスワードなどが盗まれるとサーバーが乗っ取られてしまう危険性も。それを防ぐために、まずはログイン用の一般ユーザーを作成し、悪意のある部外者が直接rootでログインできないようにします。
- 一般のユーザーを作る
- 一般ユーザーからrootへ切り替える方法を覚える
- 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/sftp | TCP 80 |
http | TCP 80 |
https | TCP 443 |
しかしこの初期値22のポート番号は広く知られているため、攻撃の対象になりかねません。そのため1024 〜 65535 までの任意の番号へ変えておくのが一般的です。今回は例として「2222」へ変更していきましょう。
- /etc/ssh/sshd_configの設定を変更する
- 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"></port></port>
変更後は、以下のコマンドでファイヤーウォールの設定に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
Related Posts
この記事に関連するエントリーは見つかりませんでした。