SSH接続を送信元IPアドレスで制限するための設定手順を分かりやすく解説

本記事はプロモーションを含みます

LinuxにSSHでログインする際に送信元IPアドレスで制限する方法を解説します。ひとつはSSH接続全体を送信元IPアドレス制限する方法、もうひとつはユーザー単位でIPアドレス制限する方法を解説します。

  1. 全ユーザーに対してSSH接続を送信元IPアドレスで制限
  2. ユーザー単位でSSH接続の送信元IPアドレスを制限

なお、本記事ではFW(ファイアウォール)は使わずSSHサーバーの基本機能のみでIP制限を実現しますので、追加のソフトウエアインストールは不要です。

また、OSはUbuntu Linuxを想定していますが、AlmaLinuxやRocky Linuxなどでも同様の方法でIPアドレス制限が実施可能です。

他のアクセス制限方法として、OSのファイアウォール機能を使って通信制限したりVPSの機能を使ったりして手軽に通信制限することもできます。詳しくは次の記事をご覧ください。

Linux VPSでIPアドレス制限をする複数の方法を解説|さくらのVPSは要注意

送信元IPアドレスの指定について

IP制限する場合、IPアドレスが固定されているか一定の範囲内から割り当てられる必要があります。自分のIPアドレスを知りたい方は以下のサイトをご覧ください。

https://whatismyip.netwiz.co.jp

踏み台サーバーからアクセスするだとかISPから固定IPが割り当てられている場合は考慮不要ですが、一般的なISPの場合は一定時間経過するとIPアドレスが変わるかも知れません。

弊社では自宅でもオフィスでも、外出先からでも同じIPアドレスを利用する目的でVPNサービスの固定IPオプションを利用しています。サーバーやネットワークのメンテナンスには非常に役に立ちますので、固定IPで悩んでいる方は参考にしてみてください。

方法①SSH接続を送信元IPアドレスで制限する

送信元IPアドレスでアクセス制限をおこなう方法のひとつにTCPWrapperがあります。LinuxにはTCPWrapperが最初からインストールされていますので、ソフトウエアを別途インストールする必要なく手軽に導入できます。

最初にSSH宛ての通信をすべて拒否する設定を/etc/hosts.denyに追加します。

/etc/hosts.deny
# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
#                  See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: some.host.name, .some.domain
#             ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#
# The PARANOID wildcard matches any host whose name does not match its
# address.
#
# You may wish to enable this to ensure any programs that don't
# validate looked up hostnames still leave understandable logs. In past
# versions of Debian this has been the default.
# ALL: PARANOID

sshd: all

次に許可したいIPアドレスを/etc/hosts.allowに追加します。

/etc/hosts.allow
# /etc/hosts.allow: list of hosts that are allowed to access the system.
#                   See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: LOCAL @some_netgroup
#             ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#

sshd: 192.168.0.123

IPアドレスでなくネットワークで指定することもできます。

/etc/hosts.allow
# /etc/hosts.allow: list of hosts that are allowed to access the system.
#                   See the manual pages hosts_access(5) and hosts_options(5).
#
# Example:    ALL: LOCAL @some_netgroup
#             ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
# If you're going to protect the portmapper use the name "rpcbind" for the
# daemon name. See rpcbind(8) and rpc.mountd(8) for further information.
#

sshd: 192.168.0.0/24

設定を保存した時点でIPアドレス制御が有効化されます。なお、IPアドレス制限が適用されるのは設定ファイルを保存してから新規に接続してきた通信となります。ですから現在接続している通信自体には通信制御は適用されません。

方法②SSH接続をユーザー単位でIPアドレス制限する

先ほどの設定はSSH接続全体をIPアドレス制限しました。しかし、複数人数でサーバーを利用している場合はユーザーによってアクセス許可するIPアドレスを変更したい場合があります。

そのような場合は、ユーザー単位でIPアドレス制限する方法を採用しましょう。設定はSSHサーバーの設定でおこないます。通常、設定ファイルは /etc/ssh/sshd_config となっています。

設定はAllowUsersでおこないます。ユーザー名だけ書けばIPアドレス制限なくSSH接続可能で、ユーザー名@IPアドレスの形式で書けばIPアドレス制限できます。なお、ユーザー名を指定しないとどこからもアクセスできませんので、注意してください。

以下の例はuser1がIP制限なくSSH接続可能で、user2192.168.0.123からのみSSH接続可能です。ここに書かれていないuser3はSSH接続できません

/etc/ssh/sshd_config
AllowUsers user1 user2@192.168.0.123

IPアドレスはネットワークでも指定できます。

/etc/ssh/sshd_config
AllowUsers user1 user2@192.168.0.0/24

また設定を複数行に分けて書くこともできます。

/etc/ssh/sshd_config
AllowUsers user1
AllowUsers user2@192.168.0.0/24

設定を保存してもIPアドレス制限はまだ有効化されていません。設定を有効化するには設定を再読み込みします。

sudo systemctl reload sshd

これでユーザー単位のIPアドレス制限が有効化されているはずです。

方法③FW(ファイアウォール)機能で制限する

SSHの他にもアクセス制限する必要がある場合はFW機能を使うとアクセス制限の管理を一元化できます。FW機能はOSが提供するものとVPSサービスが提供するものが使えます。

詳しくは以下の記事で解説しています。

Linux VPSでIPアドレス制限をする複数の方法を解説|さくらのVPSは要注意

まとめ

VPSでサーバーを公開している方はセキュリティー向上のためSSH接続でIPアドレス制限できると安心です。固定IPアドレスを使える方はぜひSSHのIPアドレス制限を設定してみてください。