前回はrootでのSSH接続ができないように対策を行った。
さて、今回はSSHの接続ポートを変更する。
が、ちょっと面倒くさい。失敗するとSSH接続できなくなるので、VNCコンソールからログインしてやるほうが良いかも。
まず、前回と同じSSHサーバーの設定ファイルを編集する。
ちなみに、”su -“でrootになって作業すると、制限がほとんどなく、取り返しのつかない失敗をする可能性があるので、”sudo”コマンドを使って実行する。のが良いと思う。
コマンド入力時、
前に”$”が表示されている時は一般ユーザ、
前に”#”が表示されている時はユーザrootでログインしている状態。
$ sudo vi /etc/ssh/sshd_config
次のようなPort設定行があるが、デフォルトのままなので、コメントアウト状態になっている。
#Port 22
まずは、ポート番号を標準の22から好きな値に変更する。
Port 1022
[:][w][q]キーで保存終了。
SSHサーバーを再起動。
$ sudo systemctl restart sshd.service
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xe" for details.
あれ?エラー。
まずは原因を調べるために、エラーメッセージ中の”journalctl -xe”を実行してみる。
6月 07 20:30:44 hostmei.vs.sakura.ne.jp systemd[1]: Starting OpenSSH server daemon...
-- Subject: Unit sshd.service has begun start-up
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit sshd.service has begun starting up.
6月 07 20:30:44 hostmei.vs.sakura.ne.jp sshd[4607]: error: Bind to port 1022 on 0.0.0.0 failed: Permission denied.
6月 07 20:30:44 hostmei.vs.sakura.ne.jp sshd[4607]: error: Bind to port 1022 on :: failed: Permission denied.
6月 07 20:30:44 hostmei.vs.sakura.ne.jp sshd[4607]: fatal: Cannot bind any address.
6月 07 20:30:44 hostmei.vs.sakura.ne.jp systemd[1]: sshd.service: Main process exited, code=exited, status=255/n/a
6月 07 20:30:44 hostmei.vs.sakura.ne.jp systemd[1]: sshd.service: Failed with result 'exit-code'.
6月 07 20:30:44 hostmei.vs.sakura.ne.jp systemd[1]: Failed to start OpenSSH server daemon.
-- Subject: Unit sshd.service has failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit sshd.service has failed.
--
-- The result is RESULT.
“Permission Denied”って〜ことは、許可されていないってこと。
ポート1022使うことが許可されていない。
何故か?SELINUXが有効になっているから?
$ getenforce
Enforcing
“Enforcing”ってことは有効になっている。
“Disabled”だと無効になっている。
では、一時的に無効にしよう。
$ sudo setenforce 0
$ getenforce
Permissive
“Permissive”ってことは一時的に無効になっている。
さて、もう一度SSHサーバーの再起動を行ってみる。
$ sudo systemctl restart sshd.service
エラーはないので、再起動できたと思うが、一応確認しておく。
$ sudo systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-06-07 20:45:25 JST; 6s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 4944 (sshd)
Tasks: 1 (limit: 2832)
Memory: 1.1M
CGroup: /system.slice/sshd.service
└─4944 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oM>
6月 07 20:45:25 hostmei.vs.sakura.ne.jp systemd[1]: Stopped OpenSSH server daemon.
6月 07 20:45:25 hostmei.vs.sakura.ne.jp systemd[1]: Starting OpenSSH server daemon…
6月 07 20:45:25 hostmei.vs.sakura.ne.jp sshd[4944]: Server listening on 0.0.0.0 port 10022.
6月 07 20:45:25 hostmei.vs.sakura.ne.jp sshd[4944]: Server listening on :: port 10022.
6月 07 20:45:25 hostmei.vs.sakura.ne.jp systemd[1]: Started OpenSSH server daemon.
起動できているので、設定したポートで接続できるかを確認しよう。
だが、今接続している状態は保持して、新規で接続する。
% ssh nori@hostmei.vs.sakura.ne.jp -p 10022 ssh: connect to host hostmei.vs.sakura.ne.jp port 10022: Connection refused
無理。
元ポートのまま?
% ssh nori@hostmei.vs.sakura.ne.jp
ssh: connect to host hostmei.vs.sakura.ne.jp port 22: Connection refuse
む〜り〜
何故か?
ファイヤーウォールが働いているから。
では、接続状態のSSHを使って、ファイヤウォールの設定を変更する。
$ sudo 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="10022"/>
</service>
そして、設定を反映させるために、設定の再読み込みを行う。
$ sudo firewall-cmd --reload
success
再度接続できるか、新規に接続してテストしてみる。
% ssh nori@hostmei.vs.sakura.ne.jp -p 10022
nori@hostmei.vs.sakura.ne.jp's password:
Last login: Sun Jun 7 20:07:05 2020 from 123.123.123.123
[nori@hostmei ~]$
接続できました。
だが、忘れていませんよね?
SELINUXを一時無効にしていたことを。
で、その設定に”semanage”ってコマンドを使いたいのだが、ミニマルなOSインストールでは、次のようにコマンドが見つからないと言われる。
$ sudo semanage port -l | grep ssh
sudo: semanage: コマンドが見つかりません
じゃあ、何をインストールすれば使えるのか?
$ dnf whatprovides semanage CentOS-8 - AppStream 2.4 MB/s | 5.8 MB 00:02 CentOS-8 - Base 2.4 MB/s | 2.2 MB 00:00 CentOS-8 - Extras 9.3 kB/s | 6.7 kB 00:00 policycoreutils-python-utils-2.9-3.el8_1.1.noarch : SELinux policy core python utilities Repo : @System 一致: ファイル名 : /usr/sbin/semanage policycoreutils-python-utils-2.9-9.el8.noarch : SELinux policy core python utilities Repo : BaseOS 一致: ファイル名 : /usr/sbin/semanage
へ〜、こんなコマンドで調べるんだね。
って、dnfって何?
DNFまたはDandified Yum (ダンディファイド ヤム)は、RPMベースのパッケージ管理システムを採用しているLinuxディストリビューション用のパッケージマネージャであるYum 3.4のフォークであり、Yumの事実上の後継バージョン[1][2][3]。
フリー百科事典『ウィキペディア(Wikipedia)』
後継か。
でも、yumもまだ使えてしまうので、yumでインストールしてしまった。
$ sudo yum install policycoreutils-python-utils CentOS-8 - AppStream 2.2 kB/s | 4.3 kB 00:01 CentOS-8 - Base 5.6 kB/s | 3.9 kB 00:00 CentOS-8 - Extras 2.4 kB/s | 1.5 kB 00:00 依存関係が解決しました。 パッケージ アーキテクチャー バージョン リポジトリー サイズ インストール: policycoreutils-python-utils noarch 2.9-3.el8_1.1 BaseOS 250 k 依存関係のインストール: checkpolicy x86_64 2.9-1.el8 BaseOS 348 k python3-audit x86_64 3.0-0.13.20190507gitf58ec40.el8 BaseOS 85 k python3-libsemanage x86_64 2.9-1.el8 BaseOS 127 k python3-policycoreutils noarch 2.9-3.el8_1.1 BaseOS 2.2 M python3-setools x86_64 4.2.2-1.el8 BaseOS 600 k トランザクションの概要 インストール 6 パッケージ ダウンロードサイズの合計: 3.6 M インストール済みのサイズ: 11 M これでよろしいですか? [y/N]: y パッケージのダウンロード: (1/6): python3-audit-3.0-0.13.20190507gitf58ec40.el8.x86_64.rpm 547 kB/s | 85 kB 00:00 (2/6): policycoreutils-python-utils-2.9-3.el8_1.1.noarch.rpm 1.2 MB/s | 250 kB 00:00 (3/6): checkpolicy-2.9-1.el8.x86_64.rpm 1.4 MB/s | 348 kB 00:00 (4/6): python3-libsemanage-2.9-1.el8.x86_64.rpm 872 kB/s | 127 kB 00:00 (5/6): python3-setools-4.2.2-1.el8.x86_64.rpm 972 kB/s | 600 kB 00:00 (6/6): python3-policycoreutils-2.9-3.el8_1.1.noarch.rpm 1.7 MB/s | 2.2 MB 00:01 合計 1.7 MB/s | 3.6 MB 00:02 警告: /var/cache/dnf/BaseOS-929b586ef1f72f69/packages/checkpolicy-2.9-1.el8.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 8483c65d: NOKEY CentOS-8 - Base 1.6 MB/s | 1.6 kB 00:00 GPG 鍵 0x8483C65D をインポート中: Userid : "CentOS (CentOS Official Signing Key) security@centos.org" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial これでよろしいですか? [y/N]: y 鍵のインポートに成功しました トランザクションの確認を実行中 トランザクションの確認に成功しました。 トランザクションのテストを実行中 トランザクションのテストに成功しました。 トランザクションを実行中 準備 : 1/1 インストール中 : python3-setools-4.2.2-1.el8.x86_64 1/6 インストール中 : python3-libsemanage-2.9-1.el8.x86_64 2/6 インストール中 : python3-audit-3.0-0.13.20190507gitf58ec40.el8.x86_64 3/6 インストール中 : checkpolicy-2.9-1.el8.x86_64 4/6 インストール中 : python3-policycoreutils-2.9-3.el8_1.1.noarch 5/6 インストール中 : policycoreutils-python-utils-2.9-3.el8_1.1.noarch 6/6 scriptletの実行中: policycoreutils-python-utils-2.9-3.el8_1.1.noarch 6/6 検証 : checkpolicy-2.9-1.el8.x86_64 1/6 検証 : policycoreutils-python-utils-2.9-3.el8_1.1.noarch 2/6 検証 : python3-audit-3.0-0.13.20190507gitf58ec40.el8.x86_64 3/6 検証 : python3-libsemanage-2.9-1.el8.x86_64 4/6 検証 : python3-policycoreutils-2.9-3.el8_1.1.noarch 5/6 検証 : python3-setools-4.2.2-1.el8.x86_64 6/6 インストール済み: policycoreutils-python-utils-2.9-3.el8_1.1.noarch checkpolicy-2.9-1.el8.x86_64 python3-audit-3.0-0.13.20190507gitf58ec40.el8.x86_64 python3-libsemanage-2.9-1.el8.x86_64 python3-policycoreutils-2.9-3.el8_1.1.noarch python3-setools-4.2.2-1.el8.x86_64 完了しました!
インストール完了。
途中[y]キーで確認作業を行った。
コマンド実行時”-y”オプションを付けると確認はいらないけど、失敗しないために確認を行う方が好き。
さて、現在SELINUXでSSHとして認識しているポートを確認します。
$ sudo semanage port -l | grep ssh
ssh_port_t tcp 22
はい。22番ポートですね。
新しいポート番号を追加しましょう。
$ sudo semanage port -a -t ssh_port_t -p tcp 1022 $ sudo semanage port -l | grep ssh ssh_port_t tcp 1022, 22
はい。追加されましたね。
じゃあ、SELINUXを有効にして、SSHサーバーを再起動してみましょう。
$ sudo setenforce 1 $ getenforce Enforcing $ sudo systemctl restart sshd.service $ sudo systemctl status sshd.service ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2020-06-07 23:16:47 JST; 8s ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 22130 (sshd) Tasks: 1 (limit: 2832) Memory: 1.2M CGroup: /system.slice/sshd.service └─22130 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -o> 6月 07 23:16:47 hostmei.vs.sakura.ne.jp systemd[1]: Starting OpenSSH server daemon… 6月 07 23:16:47 hostmei.vs.sakura.ne.jp sshd[22130]: Server listening on 0.0.0.0 port 1022. 6月 07 23:16:47 hostmei.vs.sakura.ne.jp sshd[22130]: Server listening on :: port 1022. 6月 07 23:16:47 hostmei.vs.sakura.ne.jp systemd[1]: Started OpenSSH server daemon.
念の為に、OSの再起動を行って、それでも接続できるかを確認しておきましょう。
$ sudo reboot now
一つ気になることがありますね?
そうです。ポート22が空いたままです。
なので、閉じましょう。
$ sudo semanage port -d -t ssh_port_t -p tcp 22 ValueError: ポート tcp/22 はポリシー内で定義されているため削除できません
と、エラーになります。英語だと、
ValueError: Port tcp/22 is defined in policy, cannot be deleted
消せないのかよ!
さて、次回はメール送信機能を追加します。