Google Cloud Platform(以下GCP)のGoogle Compute Engine(以下GCE)で作成したVMインスタンスへアクセスする際のSSHポートを変更する。
今回は「
22」から「
20055」へ変更する。
GCEはVMインスタンスの上位にFWがあるため、設定変更箇所は下記の4箇所となる。
・GCPのファイアウォールルールに追加してVMに適用
・Cent OSのSELinuxにポリシー追加
・Cent OSのfirewalldに設定追加
・sshdにポート番号追加
その後疎通確認してから22番ポートを閉じていく。
■GCPのファイアウォールルールに追加する。
メニューの「VPCネットワーク」 - 「
ファイアウォールルール」から「ファイアウォールルールを作成」から新規ルール作成画面に移る。
設定するのは下記の項目。
「
名前」はわかりやすいように「
allow-ssh20055」に設定
「
ターゲットタグ」を名称と同じにして、VMインスタンスへ適用する際にわかりやすくしてみた。任意なので自分がわかりやすければOK。
「
ソースIPの範囲」は「
0.0.0.0/0」
「
プロトコルとポート」は「
指定したプロトコルとポート」から「
tcp」にチェックを付けて「
20055」を入力して保存。
VMインスタンスの編集から設定画面を開いて「
ネットワークタグ」に先程作成したルールの「
ターゲットタグ」を入力する。
これでGCP上のファイアウォールルールでTCPの20055番ポートが空いた。
■SELinuxにポリシー追加
SELinuxの設定を変更するためVMにSSHでログインしてroot権限に移行する
$ sudo su -
SELinuxの状態を確認する。
# getenforce
「
Enforcing」と出れば有効化されているので作業を続ける。
設定がややこしいからと言って無効化するような無粋なことはしない。
SELinuxの設定変更には「
semanage」コマンドを利用するが、今回立てたVMインスタンスのCent OSではすでにインストール済みだった為このまま続ける。
まずはSELinuxが許可しているSSHのポートを確認する。
# semanage port --list | grep ssh
tcpの22番ポートが許可されているので、これに今回追加する20055を追加する。
「
--add」オプションでポリシーを追加する。
# semanage port --add --type ssh_port_t --proto tcp 20055
設定が追加されているかを確認する。
# semanage port --list | grep ssh
これでSELinuxのポリシーに20055番ポートの設定が追加された。
22番ポートが残っているが他の設定があるから一旦このままで。
■firewalldに設定追加
次にfirewalldの設定を変更する。
firewalldの稼働状況の確認から。
# systemctl status firewalld
Active:の値がactive(running)となっているのでファイアウォールは有効になっている。
eth0のところにWARNINGが出ているが今回は無視しよう。
現状の確認としてファイアウォールが外に向けて公開しているサービスを確認する。
# firewall-cmd --list-services --zone=public --permanent
開放するポートを設定するが、この設定が入っているファイル「
/usr/lib/firewalld/services/ssh.xml 」ではなく、
「
/etc/firewalld/services/」に「
ssh.xml」を配置して設定を記述する必要がある。
既存のファイルを/etc/firewalld/services/にコピーする
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
コピーした先のファイルに2005番ポートの設定を追加する。
# vi /etc/firewalld/services/ssh.xml
設定が完了したらfirewalldの設定を再読込させる。
# firewall-cmd --reload
■sshdにポート番号を追加
最後にsshdにポート番号を追加する。
設定ファイルは「
/etc/ssh/sshd_config」に記述されているのでこちらを編集する。
# vi /etc/ssh/sshd_config
上の方に#でコメントアウトしてある「
#Port22」を下記に修正
Port 22
Port 20055
vimだとコメントアウトした文字色が背景色に近く見辛かったので今回はviで編集。
またその内vimの設定イジるか。
これで22番と20055番でsshへアクセスできるようになったはずなので、設定を再読込する。
# systemctl restart sshd
クライアントPC側の「
.ssh」フォルダにある「
config」ファイルのポート番号も忘れずに新しいポート番号に書き換えて、新しいポート番号でアクセスしてみる。
ここまでで新しく設定した20055番ポートでSSH接続できるようになった。
あとは残っている22番ポートの設定を無効化していけばいい。
■GCPのファイアウォールルールに追加
冒頭で行った新しいポート番号を登録する要領で22番ポートを拒否するルールを作成して、VMインスタンスへ適用する。
「
名前」はわかりやすいように「
deny-ssh22」に設定
「
一致したときのアクション」を「
拒否」に設定
「
ターゲットタグ」はこれも名前と同じモノに
「
ソースIPの範囲」は「
0.0.0.0/0」
「
プロトコルとポート」は「
指定したプロトコルとポート」から「
tcp」にチェックを付けて「
20055」を入力して保存。
同様にVMインスタンスの編集から設定画面を開いて「
ネットワークタグ」に先程作成したルールの「
ターゲットタグ」を入力する。
また、ブラウザからのSSH接続はこのままでは出来ないが、
VMインスタンスのSSHの右にあるプルダウンメニューから「ブラウザウィンドウでカスタムポートを開く」を実行して、新しく設定した20055を入力すれば問題なく接続できた。
実際の挙動としてはこれをやるだけで外部からの22番ポートでのSSH接続はできなくなる。
だからといって他の設定を置いておくのも気持ち悪いので22番ポートの設定を無効化していく。
■sshdから22番ポートを無効化
上で編集した「
/etc/ssh/sshd_config」を編集する。
# vi /etc/ssh/sshd_config
22番ポートの情報をコメントアウト
#Port 22
設定を再読込する。
# systemctl restart sshd
■firewalldから22番ポートを無効化
上で編集したファイルから22番ポートの記述を削除する。
# vi /etc/firewalld/services/ssh.xml
firewalldの設定を再読込させる。
# firewall-cmd --reload
■SELinuxのポリシーから削除(出来なかった)
削除する場合は「
semanage」コマンドで「
--delete」オプションを利用する。
# semanage port --delete --type ssh_port_t --proto tcp 22
とやってみたものの、
「ポート tcp/22 はポリシーに定義されているため、削除できません」
との事で削除出来なかった。
まぁこれで22番ポートのアクセスが出来ないことは確認できたので良しとしようか。