鍵認証を行い、sshのポート番号を変更する
やりたいこと
パスワード認証を無効化して、鍵認証のみを有効にします。
sshdのポート番号を変更します。
環境
- さくらVPSに CentOS 7.0 を Minimal Install しました。
- クライアントはteratermを利用します。
- SSHでリモートログインが行えます。
- ファイヤーウォールの設定は下の状態です。
$ sudo firewall-cmd --list-all [sudo] password for xxxxxxx: public (default, active) interfaces: eth0 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
鍵作成
- Teratermの「設定」->「SSH鍵作成」を選択します。
- 鍵の種類に「RSA」を指定し、ビット長を4096に変更して、「生成」ボタンを押します。 1.「鍵のパスフレーズ」、「パスフレーズの確認」を入力可能になったら、秘密鍵のパスフレーズを入力します。
- 「公開鍵の保存」と「秘密鍵の保存」をそれぞれ押して、公開鍵と秘密鍵をそれぞれ保存します。
公開鍵をサーバに転送
- 公開鍵を保存するフォルダを作成します。
$ mkdir ~/ssh $ chmod 700 ~/ssh
上側の「From:」に作成した公開鍵を指定し、「To:」に~/.ssh/authorized_keys
を指定した後に、「Send」を押してファイルを転送します。
- 転送した公開鍵のパーミッションを変更します。
$ chmod 700 ~/.ssh/authorized_keys
公開鍵でのログインを確認
転送した公開鍵でログインがおこなえることを確認します。ログインに失敗する場合には /var/log/secure
に出力されたログをみて原因を判断します。
~/.ssh/authorized_keys
に公開鍵が保存されていることを確認します。テキストファイルなのでcat ~/.ssh/authorized_keys
で中身をみます。転送した公開鍵のファイル
~/.ssh/authorized_keys
のパーミッションが700(-rwx------)になっていることを確認します。
sshdのポート番号とファイヤーウォールの設定変更
ファイヤーウォールが変更後のポートを通るパケットを許可する
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-custom.xml
を実行して、ポート番号を変更したsshのサービスを定義します。- /etc/firewalld/services/ssh-custom.xmlを編集し、shortのサービス名とportタグポート番号を変更します。
sudo firewall-cmd --reload
を実行して、サービスの追加を反映します。firewall-cmd --get-services
を実行して、ssh-customが追加されていることを確認します。sudo firewall-cmd --add-service=ssh-custom --zone=public --permanent
を実行してポート番号を変更したsshのサービスをpublicゾーンに追加します。sudo firewall-cmd --reload
を実行して、publicゾーンへの反映を有効にします。sudo firewall-cmd --list-all
を実行して、pubilcゾーンに追加されたことを確認します。- 念のために
iptables -L -n
でも確認します。
変更したポート番号でのログインを確認する
接続済みのsshは残しておき、新たなTeratermを起動して、変更後のポート番号でsshのログインが行えることを確認します。
sshの設定を変更する
- Port 22を有効にしてポート番号を変更します。
PubkeyAuthentication yes
を有効にします。PasswordAuthentication yes
を無効にします。
最後にsudo systemctl restart sshd
でsshdを再起動します。起動しない場合にはjournalctl -xn
で原因を判断します。error: Bind to port xx22 on 0.0.0.0 failed: Permission denied.
とメッセージが出ている場合には SELinuxが効いています。
22番ポートを閉じる
sudo firewall-cmd --remove-service=ssh --zone=public --permanent
でpublicゾーンからsshのサービスを削除します。sudo firewall-cmd --reload
を実行して、publicゾーンへの反映を有効にします。sudo firewall-cmd --list-all
を実行して、pubilcゾーンに追加されたことを確認します。
$ sudo firewall-cmd --list-all public (default, active) interfaces: eth0 sources: services: dhcpv6-client ssh-custom ports: masquerade: no forward-ports: icmp-blocks: rich rules: