はじめに
サーバをMinimum状態から構築すると開発者ツールなどを手動でインストールしなければいけないので少々面倒ですが、上手く構築できたときは充実感がありますね。
例えば、ソースからPostfixとDovecotでメールサーバを構築し、且つ送受信を暗号化するようTLS/SSL実装させて自分のスマホ宛てにメールを送信。
受信メールがちゃんと暗号化されていることを確認できたときは嬉しいですね。
昔は家に自宅サーバを構築して運用していましたが、最近は流石にVPSを使っている方が多いのではないかと思います。
どちらの環境でもそうですが、ローカル端末からリモートでサーバに接続する際、SSHの鍵認証を施してあげた方がセキュリティ的にも安心でよろしいかと思います。
前置きが長くなりましたが、今回はCentOS7にSSHサーバを構築する手順を載せたいと思います。
事前準備
sshがインストールされているかを確認します。
# yum list installed | grep ssh
インストールされていなければ、インストールします。
# yum install openssh-server
設定ファイルを修正
sshd_configを修正します。
# vi /etc/ssh/sshd_config
# <変更前>
# Port 22
# ListenAddress 0.0.0.0
PermitRootLogin without-password
# RSAAuthentication yes
# PasswordAuthentication yes
# PermitEmptyPassword no
以下のように変更します。
# <変更後>
Port 80022
ListenAddress 0.0.0.0
PermitRootLogin no
RSAAuthentication yes
PasswordAuthentication yes
# ※現段階ではパスワード認証を有効にしていますが、後で無効化します。
ssh用のユーザアカウントを作成
後で接続テストを行う際に使用するテストアカウントを作成します。
# useradd test_user
# passwd test_user
公開鍵、秘密鍵を生成
リモートでログインする際の認証用に使う鍵(公開鍵、秘密鍵)を生成します。
$ ssh-keygen -t ecdsa -b 521
公開鍵をサーバに設置
生成した公開鍵を「~/.ssh/authorized_keys」に登録します。
※ssh-keygen を実行した際、.sshディレクトリが自動作成されると思いますが、もし作成されなかった場合は手動で以下のように行います。
$ mkdir .sshd
$ chmod 700 .sshd
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
公開鍵と秘密鍵のファイルが生成されたことを確認します。
$ pwd
/home/test_user/.ssh
$ ls
id_ecdsa id_ecdsa.pub
$
ちゃんと作られてますね。
公開鍵を「authorized_keys」に追記します。
$ cat id_ecdsa.pub >> authorized_keys
これでサーバに公開鍵を設置する作業は完了です。
公開鍵認証で問題なく接続できることを確認
ローカル端末からTeratermなどでリモートサーバに接続し、秘密鍵を指定して問題なくログインできることを確認します。
設定ファイル(sshd_config)を修正しているので、一旦sshをリスタートさせます(そもそも起動していなければstartでよいです)。
# systemctl restart sshd.service
firewalldでsshを許可
firewallにポートを許可します。
# firewall-cmd –add-port=80022/tcp –zone=public –permanent
success
# firewall-cmd –reload
success
#
portが追加されたことを確認します。
# firewall-cmd –list-all –zone=public
Teratermで接続確認してみます。
あれっ!接続が拒否されました、と表示された。。
なにゆえ??
sshをリブートしてもport番号が22番に固定されたままだったのが原因でした。
手動で以下の通り、ファイルを変更します(少々見ずらいですが)。
<変更前>
# vi /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
<変更後>
# vi /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="80022"/>
</service>
firewalldをリロードします。
# systemctl reload firewalld.service
ログを見ると、、、
error: Bind to port 80022 on 0.0.0.0 failed: Permission denied.
あれっ!まだだめです。。
SElinuxに引っかかっているかも。
SELinuxの現在の状態を確認
SELinuxが無効になっているかを確認します。
# getenforce
Enforcing
#
あ~、動いていますね。
無効化します。
# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted – Targeted processes are protected,
# minimum – Modification of targeted policy. Only selected processes are protected.
# mls – Multi Level Security protection.
SELINUXTYPE=targeted
OSを再起動
SELinuxの設定を変更したので、OSを再起動します。
# /sbin/shutdown -r now
Teratermで接続できるかを確認します。
無事接続できました!
めでたし、めでたし。
まとめ
SSHの設定をデフォルトから変更し、プロセスも再起動したから上手くいくはず!と思ってしまいがちですが、SELinuxが邪魔していたり思わぬところに伏兵がいます。
上手く接続できないときは「firewallの設定を忘れていた」ということも意外と結構あるので、皆様お気をつけください。
コメント