よしだのブログ

サブタイトルはありません。

(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 を開く許可を与えていなかったことが原因でした。

作業ログ

  • 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ログインできるインスタンスを作る! - よしだのブログ