(AWS/EC2) ポート22での接続が禁止されているイントラから EC2 インスタンスにSSH接続する
どうも! 今日も技術ネタ&AWS EC2 入門です。まあ、厳密には EC2 関係ないんですけどね。
追記
このエントリの作業内容を EC2 の User Data という機能を使って、自動で行うことができます。詳しくは以下のエントリから。
【追記あり】(AWS/EC2) UserDataを使って、自動でイントラからSSHログインできるインスタンスを作る! - よしだのブログ
社内イントラから EC2 に SSH で接続できない。
お仕事で検証用の仮想マシンをつくろうと思って、早速勉強中の EC2 で作ることにしました。ところが、SSH で接続しようとしたとろこ、403 Forbidden が出て接続が出来ません。社内からはプロキシ経由でインターネットにアクセスする構成になっているのですが、調べてみたところポート 22 での接続(connectメソッド)が許可されていないようで、これが原因で接続が出来ないことがわかりました。
そういうわけで、sshd のポートを 443 に変更して接続できるようにしようとしました。ところが、443 を追加してもリッスンしないという状態になり、解決に半日も潰してしましました。結論を先に書くと、SELinux が sshd に 22 以外の 443 を開く許可を与えていなかったことが原因でした。
- 22番ポートでの connect が squid のデフォルトで禁止されている件については、以下を参考にしました。
HTTPプロキシ経由でのSSH(その3) プロキシが22番へのCONNECTを拒否する場合 - それマグで!
作業ログ
- sshd_config の Port を追加。443 だけでなく、実験で 10022 も追加。以下は、/etc/ssh/sshd_config の中身。
# The strategy used for options in the default sshd_config shipped with # OpenSSH is to specify options with their default value where # possible, but leave them commented. Uncommented options change a # default value. Port 22 Port 443 Port 10022 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress ::
- sshd を再起動するが、22 と 10022 は開くが、443だけリッスンにならない。
# /etc/init.d/sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] # netstat -anp | sshd sshd re-exec requires execution with an absolute path # netstat -anp | grep sshd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1771/sshd tcp 0 0 0.0.0.0:10022 0.0.0.0:* LISTEN 1771/sshd tcp 0 52 (IPアドレス):22 (IPアドレス):54965 ESTABLISHED 1435/sshd tcp 0 0 :::22 :::* LISTEN 1771/sshd tcp 0 0 :::10022 :::* LISTEN 1771/sshd unix 3 [ ] STREAM CONNECTED 13349 1435/sshd unix 3 [ ] STREAM CONNECTED 13348 1438/sshd unix 2 [ ] DGRAM 13344 1435/sshd
- 443ポートは特に使われていない。httpd も入れていないので当たり前。
# netstat -anp | grep 443 # #
- ログを見たら Permission denied のエラーが出ていた。ちなみに、sshd のログは、/var/log/messages ではなく /var/log/secure に出る。
Mar 4 21:28:36 (ホスト名) sshd[25534]: error: Bind to port 443 on 0.0.0.0 failed: Permission denied. Mar 4 21:28:36 (ホスト名) sshd[25534]: error: Bind to port 443 on :: failed: Permission denied.
- ぐぐってみたところ、答えは SELinux。以下のとおりデフォルトではsshには 22 が割り付けられている。
- 一方、443 は当然 http
# semanage port -l | grep ssh ssh_port_t tcp 22 # semanage port -l | grep 443 http_port_t tcp 80, 443, 488, 8008, 8009, 8443 pki_ca_port_t tcp 9180, 9701, 9443-9447 pki_kra_port_t tcp 10180, 10701, 10443-10446 pki_ocsp_port_t tcp 11180, 11701, 11443-11446 pki_tks_port_t tcp 13180, 13701, 13443-13446
- SELinuxを一時無効にして再起動したらリッスンした。どーん。。。
# setenforce 0 # getenforce Permissive # /etc/init.d/sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] # netstat -anp | grep sshd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 25600/sshd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 25600/sshd tcp 0 0 0.0.0.0:10022 0.0.0.0:* LISTEN 25600/sshd tcp 0 52 (IPアドレス):22 (IPアドレス):59407 ESTABLISHED 1859/sshd tcp 0 0 :::22 :::* LISTEN 25600/sshd tcp 0 0 :::443 :::* LISTEN 25600/sshd tcp 0 0 :::10022 :::* LISTEN 25600/sshd unix 3 [ ] STREAM CONNECTED 15929 1859/sshd unix 3 [ ] STREAM CONNECTED 15928 1862/sshd unix 2 [ ] DGRAM 15924 1859/sshd
- semanage で 443 を ssh に割り付ける。http から 443 を delete することはできなかったので -m で。
# semanage port -l | grep ssh ssh_port_t tcp 22 # semanage port -l | grep 443 http_port_t tcp 80, 443, 488, 8008, 8009, 8443 pki_ca_port_t tcp 9180, 9701, 9443-9447 pki_kra_port_t tcp 10180, 10701, 10443-10446 pki_ocsp_port_t tcp 11180, 11701, 11443-11446 pki_tks_port_t tcp 13180, 13701, 13443-13446 # semanage port -a -t ssh_port_t -p tcp 443 /usr/sbin/semanage: Port tcp/443 already defined # semanage port -d -t http_port_t -p tcp 443 /usr/sbin/semanage: Port tcp/443 is defined in policy, cannot be deleted # semanage port -m -t ssh_port_t -p tcp 443 # semanage port -l | grep ssh ssh_port_t tcp 443, 22 # semanage port -l | grep http http_cache_port_t tcp 3128, 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 443, 488, 8008, 8009, 8443 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989
- 再起動して確認。
# /etc/init.d/sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] # # netstat -anp | grep sshd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1532/sshd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1532/sshd tcp 0 0 0.0.0.0:10022 0.0.0.0:* LISTEN 1532/sshd tcp 0 (IPアドレス):22 (IPアドレス):1438 ESTABLISHED 1353/sshd tcp 0 0 :::22 :::* LISTEN 1532/sshd tcp 0 0 :::443 :::* LISTEN 1532/sshd tcp 0 0 :::10022 :::* LISTEN 1532/sshd unix 3 [ ] STREAM CONNECTED 12872 1353/sshd unix 3 [ ] STREAM CONNECTED 12871 1356/sshd unix 2 [ ] DGRAM 12867 1353/sshd
残課題
インスタンスを作るたびに毎回設定するのも面倒くさいので、ユーザーデータにスクリプトを仕込んで置いて設定できるようにしたいです。
しました。
【追記あり】(AWS/EC2) UserDataを使って、自動でイントラからSSHログインできるインスタンスを作る! - よしだのブログ