本記事はプロモーションを含みます
VPSは自由度が高い分、サーバー管理は自分でおこなう必要があります。セキュリティは特に重要で、適切にパケットフィルタリングすることは非常に重要です。
本記事ではLinux VPSを利用している方のために、いくつかあるIPアドレス制限の方法の中から次の3つを解説します。
- VPSの機能でIPアドレス制限する
- LinuxのTcpWrapperでIPアドレス制限する
- LinuxのFW機能(ufw)でIPアドレス制限する
Contents
送信元IPアドレスの指定について
IP制限する場合、IPアドレスが固定されているか一定の範囲内から割り当てられる必要があります。自分のIPアドレスを知りたい方は以下のサイトをご覧ください。
https://whatismyip.netwiz.co.jp
踏み台サーバーからアクセスするだとかISPから固定IPが割り当てられている場合は考慮不要ですが、一般的なISPの場合は一定時間経過するとIPアドレスが変わるかも知れません。
弊社では自宅でもオフィスでも、外出先からでも同じIPアドレスを利用する目的でVPNサービスの固定IPオプションを利用しています。サーバーやネットワークのメンテには非常に役に立つので、固定IPで悩んでいる方は参考にしてみてください。
VPSサービスの機能を使う
VPSサービスにはアクセス制限する機能が備わっているため、この機能を使う方法を解説します。VPSサービスの機能を使うメリットはOS設定を変更する必要がなく初心者の方でも手軽にアクセス制限ができる点です。
簡単なアクセス制限ならこれで十分ですが、利用には注意が必要です
カゴヤVPSの機能でアクセス制限する(機能名:セキュリティグループ)
カゴヤVPSのセキュリティグループはデフォルト無効です。機能的に優れており、VPSサービスの中で唯一まともだと感じるアドレス制限機能です。
カゴヤVPSの場合はダッシュボードから[セキュリティ]-[セキュリティグループ]をクリックします。
画面右上の[セキュリティグループ追加]というボタンをクリックするとセキュリティグループを作成する画面が表示されるので「プロトコル」「IP」「ポート」を指定します。
「プロトコル」はTCPとUDPの2種類選択できます。「IP」は許可したい送信元IPアドレスを指定します。「ポート」は許可したいポート番号です。すべて許可する場合はIP・ポート共に「*」とします。
また、設定は複数追加できます(「+」マークをクリックすると設定追加できる)。
たとえば次のようにするとSSHについては1.2.3.4から許可し、HTTPS(443/tcp)については全IPアドレスから許可するようになります。
セキュリティグループを登録しただけでは使えません。インスタンスに適用してはじめて効果を発揮します。インスタンスに適用するにはダッシュボードの[インスタンス]から適用したいインスタンス名をクリックします。
インスタンスの画面に入るので「セキュリティグループ」 の欄にある歯車ボタンをクリックします。
ここから適用したいセキュリティグループを選択して[設定]ボタンをクリックします。
これで設定と適用は完了です。カゴヤVPSのセキュリティグループは複数のVPSを利用している際に共通の設定で管理できるというメリットがあります。
ConoHa VPSの機能でアクセス制限する(機能名:接続許可ポート)
ConoHa VPSはデフォルトですべての通信を許可する設定になっています。
ダッシュボードの[サーバー]からアクセス制限したいインスタンスのネームタグをクリックします。
インスタンス情報を表示させると、下の方に「接続許可ポート」という箇所があり、デフォルト状態ですと[全て許可]にチェックが入っています(インスタンス作成時に変更できます)。
設定を変えるには[全て許可]のチェックを外して制限したいポートにチェックを入れます。
この画面で設定できるのはVPSに入ってくる通信のみです。VPSから外向けの通信はAPIを使う必要がありますが、一般ユーザーがAPIで設定を変更するのは難しいのでここでは解説しません。
注意点としてConoHa VPSのアクセス制限は送信元アドレスを制限できず、あらかじめ決まったポートの組み合わせのみ制限できます。
ConoHa VPSのアクセス制限はあまり実用的とは言えません…
さくらのVPSの機能でアクセス制限する(機能名:パケットフィルター)
さくらのVPSはデフォルトでSSH(22/tcp)のみ通信許可をしています。WEBサイトを立ち上げる際は注意が必要です。また、アクセス制限できない通信があるので注意してください。
さくらのVPSのパケットフィルターは無効化してOSのファイアウォール機能で制限した方がいいです
ダッシュボードの[サーバー]からアクセス制限したいインスタンスをクリックします。
インスタンス画面で[パケットフィルター設定]をクリックします。
初期設定ではSSH宛ての通信が全IPアドレスから許可されていて、それ以外の通信(一部除く)を制限しています。
32676~65535番の通信は仕様により制限できません
設定を変更するには[パケットフィルターを設定]をクリックします。
パケットフィルターを設定する場合、WEBやメールなど事前に用意された設定だけでなく[カスタム]も選択できます。
[カスタム]を選択するとプロトコルとポート番号、送信元IPアドレスを指定できるようになります。
ただし指定できるポート番号は1~32767の範囲に限定されます。
パケットフィルターを解除したい場合は赤文字の[パケットフィルターを利用しない]をクリックします。
さくらのVPSのパケットフィルター注意点 ※重要
さくらのVPSのパケットフィルターはTCP/UDPの32768~65535番、UDP 123番(NTP)、IPv6、ICMP、フラグメントパケットはすべて許可されます(制限できません)。
このような仕様はセキュリティの観点から「アウト」だと思っているので、個人的にはさくらのVPSを使う場合は[パケットフィルターを利用しない]を選択した上でご自身でufwなどで制限をかけることをおすすめします。
さくらのVPSのパケットフィルターは無効化した方が良い理由制限できないポートがあるとかフラグメントパケットはすべて許可するとか、ちょっと信じられないです…
tcpwrapperでアクセス制限する
tcpwrapper(tcpd)は古くから利用されている制限方法で、hosts.allowやhosts.denyといった設定ファイルを参照し,許可され ていれば指定したデーモンを起動する仕組みです。
最近のLinuxはlibwrapというライブラリでtcpwrapperの機能が提供されているので、tcpwrapperで制限できるか確認したい場合はlddコマンドが使えます。
root@web:~# ldd /usr/sbin/sshd | grep libwrap libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f5565dcc000) root@web:~#
設定方法は簡単です。設定のフォーマットは次のようになります。
デーモンリスト:クライアントリスト
デーモンリストには設定したいデーモン名(複数可)を記述し、クライアントリストには拒否・許可したいホスト名やネットワークを記述します(複数可)。
許可したい設定はhosts.allowに記述し、拒否したい設定はhosts.denyに記述します。通常は/etc/hosts.allow、/etc/hosts.denyにファイルがあります。
特定のアドレスからのみ通信を許可したい場合、最初に/etc/hosts.denyですべて拒否します。これで全通信が拒否されます。
(/etc/hosts.deny)ALL:ALL
次に許可したい通信を/etc/hosts.allowで設定します。この設定をすると、全通信が192.168.0.0/24のみ許可するようになります。
(/etc/hosts.allow)ALL: 192.168.0.0/24
sshdだけ通信制限したい場合は「ALL」の箇所を「sshd」に設定します。詳しくは次の記事をご覧ください。
SSH接続を送信元IPアドレスで制限するための設定手順を分かりやすく解説OSのファイアウォール機能(ufw)でアクセス制限する
OSのファイアウォール機能を使うと細かく制限できます。ufwは使い勝手が良く、Ubuntu Linuxの場合はデフォルトで起動しているためufwの設定方法を解説します。
ネットワークの知識がないと少し難しく感じる場合がありますが、実際には大して難しくないので頑張って設定方法を覚えてしまいましょう。
ufwが起動しているのか確認するにはsystemctl status ufw
コマンドを実行します。
$ systemctl status ufw ● ufw.service - Uncomplicated firewall Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2023-09-25 02:24:21 UTC; 6min ago Docs: man:ufw(8) Main PID: 519 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4558) Memory: 0B CGroup: /system.slice/ufw.service Warning: journal has been rotated since unit was started, output may be incomplete. $
ufwを起動してOS起動時にも自動起動させるにはsudo systemctl enable ufw
とsudo systemctl start ufw
を実行します。
既にufwが起動している場合は不要です
$ sudo systemctl enable ufw Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable ufw $ sudo systemctl start ufw $
現在のufw設定を確認する
まずは現在のufwの状態を見てみましょう。sudo ufw status
コマンドを実行します。
$ sudo ufw status Status: inactive $
このように「inactive」と表示された場合はufwは起動していますが有効ではありません。ufwを有効化するにはsudo ufw enable
コマンドを実行します。
しかし有効化する前に注意点があります。デフォルト設定ではincomingがdenyされているためufwを有効にするとssh接続ができなくなる場合があります。
ログイン中のssh接続は切れませんが、万が一切断されるとリモートログインできなくなります
そのためVPSを使っている方はリモートログインできなくなったらコンソールログインをして対処してください。
VPSでコンソールからログインする方法を解説それではsudo ufw enable
コマンドを実行してufwを有効化しましょう。
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup $
sudo ufw status verbose
コマンドを実行すると現在の状態が確認できます。
初期状態であれば次のようになっています。
incoming(VPSに入ってくる通信) | deny(破棄) |
outgoing(VPSから出て行く通信) | allow(許可) |
routed(ルーティング) | disabled(無効) |
denyとrejectの違いですが、denyは通信を破棄するため通信がタイムアウトします。rejectの場合は明示的に拒否するため通信が切断されます。
denyとrejectどちらでも良いのですが、FW製品では大抵の場合は破棄するので迷ったら「deny」を使ってください
ufwルールの追加
ufwのルール設定方法はいろいろありますが、from/toやプロトコルを明示的に指定する方法をおすすめします。たとえば、VPSのIPアドレスが「192.168.218.134」で「192.168.218.0/24」からのみSSHログインを許可するには次のようにします。
sudo ufw allow from 192.168.218.0/24 to 192.168.218.134/32 proto tcp port 22
ufwルールの削除
ufwのルール削除方法はいろいろありますが、ルール番号を指定して削除する方法がおすすめです。現在適用されているルールを番号付きで確認するにはsudo ufw status numbered
コマンドを実行します。
$ sudo ufw status numbered Status: active To Action From -- ------ ---- [ 1] 192.168.218.134 22/tcp ALLOW IN 192.168.218.0/24 $
ルールがひとつしか設定されていませんが、1番のルールを削除してみます。削除するにはsudo ufw delete 番号
を実行します。
$ sudo ufw delete 1 Deleting: allow from 192.168.218.0/24 to 192.168.218.134 port 22 proto tcp Proceed with operation (y|n)? y Rule deleted $
ufwはルールの番号順に評価する
許可設定を追加していくだけならば問題は起きないのですが、破棄や拒否と組み合わせる場合は注意してください。
たとえば次のようにufwでルールを追加します。
$ sudo ufw allow from 192.168.218.0/24 to 192.168.218.134/32 proto tcp port 22 Rule added $ sudo ufw deny from 192.168.218.1/32 to 192.168.218.134/32 proto tcp port 22 Rule added $
番号付きでルールを表示させると次のようになります。
$ sudo ufw status numbered Status: active To Action From -- ------ ---- [ 1] 192.168.218.134 22/tcp ALLOW IN 192.168.218.0/24 [ 2] 192.168.218.134 22/tcp DENY IN 192.168.218.1 $
このルールは192.168.218.0/24を許可した後に192.168.218.1からの通信を破棄しています。一見すると192.168.218.1からsshログインできないように見えますがログインできてしまいます。理由はufwは番号順にルールを評価し、条件に一致するとそこで処理を終了するためです。
そのため192.168.218.0/24を許可しつつ192.168.218.1だけ破棄したい場合はルールを逆にしなくてはいけません。
まず最初にsudo ufw delete 2
コマンドで2番のルールを削除しましょう。
$ sudo ufw delete 2 Deleting: deny from 192.168.218.1 to 192.168.218.134 port 22 proto tcp Proceed with operation (y|n)? y Rule deleted $
これでルールは1番だけになりました。
$ sudo ufw status numbered Status: active To Action From -- ------ ---- [ 1] 192.168.218.134 22/tcp ALLOW IN 192.168.218.0/24 $
次に、1番の前に192.168.218.1からのssh通信を拒否する設定を追加します。これは「insert」オプションで実現できます。insert 1
とすることで1番の前にルールを追加できます。
$ sudo ufw insert 1 deny from 192.168.218.1/32 to 192.168.218.134/32 proto tcp port 22 Rule inserted $
番号付きでルールを表示させると1番だった許可ルールが2番になって、さきほど追加したルールが1番になっています。これで192.168.218.1からのssh通信を拒否しつつ192.168.218.0/24からのssh通信を許可できます。
$ sudo ufw status numbered Status: active To Action From -- ------ ---- [ 1] 192.168.218.134 22/tcp DENY IN 192.168.218.1 [ 2] 192.168.218.134 22/tcp ALLOW IN 192.168.218.0/24 $
ルール番号に起因する設定ミスはプロの現場でも時々発生するので注意してください
設定を初期化する
設定がゴチャゴチャしてしまった場合など、いったん初期化したい場合はsudo ufw reset
コマンドで初期化できます。
コマンドを実行すると現在の設定をバックアップファイルに保存して初期化します。初期化後は「inactive」状態となります。
$ sudo ufw reset Resetting all rules to installed defaults. This may disrupt existing ssh connections. Proceed with operation (y|n)? y Backing up 'user.rules' to '/etc/ufw/user.rules.20230925_104331' Backing up 'before.rules' to '/etc/ufw/before.rules.20230925_104331' Backing up 'after.rules' to '/etc/ufw/after.rules.20230925_104331' Backing up 'user6.rules' to '/etc/ufw/user6.rules.20230925_104331' Backing up 'before6.rules' to '/etc/ufw/before6.rules.20230925_104331' Backing up 'after6.rules' to '/etc/ufw/after6.rules.20230925_104331' $ sudo ufw status verbose Status: inactive $
(可能であれば)outgoingはデフォルトdenyにする
ufwのデフォルト設定ではoutgoing(外向け通信)がallowとなっています。
$ sudo ufw status verbose numbered Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed)
もし可能であればsudo ufw default deny outgoing
コマンドでoutgoingをdenyにすることをおすすめします。
$ sudo ufw default deny outgoing Default outgoing policy changed to 'deny' (be sure to update your rules accordingly) $
$ sudo ufw status verbose Status: active Logging: on (low) Default: deny (incoming), deny (outgoing), disabled (routed)
上記のようにoutgoingをdenyにした上でDNSやNTPなど必要な通信だけ許可するとセキュリティレベルが向上します。
ただし、これは必須ではありません。
この記事を読んでいる方は「なぜ外向けの通信を気にする必要があるの?」と思われるかも知れません。
理由は大きく分けると2つあります。これらの理由を読んでoutgoingをdenyにするか決めてください。
外部からファイルをダウンロードできる
攻撃者は必ずと言ってもいいほど外部から何らかのファイルをダウンロードします。大抵の場合はWEBシェル(WEBブラウザからコマンドを実行できるバックドア)や攻撃コードの類いです。
また、sshの送信元制限をしていない場合、条件が整えば攻撃者は自分の公開鍵をauthorized_keysに追加してシェルアクセスを容易に手に入れることができるようになります(パスワードなしにリモートログインできるようになります)。
このように自由に通信できるサーバーは他のサーバーやネットワークへの攻撃の足がかりされる場合があります。
対話的なシェルアクセスを許してしまう
sshでログインしたときのような対話的なシェルアクセスはincoming通信を制限しても攻撃者に奪取されます。
具体的にはリバースシェルという手法を使います。通常は攻撃者側からサーバーに接続してシェルにアクセスしますが、リバースシェルはサーバーから攻撃側に向かって接続をおこないサーバー側のシェルにアクセスします。
この手法は特別なものではなくて攻撃者にとって一般的な方法です。
自作のWEBアプリを公開する場合は侵入を許す可能性が高くなるのでoutgoingを制限することをおすすめします
sshのアクセス制限
sshはtcpwrapperとsshdの設定でアクセス制限できます。全ユーザー共通でsshアクセスを制限したい場合はfirewalldやtcpwrapperが便利ですが、ユーザーごとにアクセス制限の設定を変更したい場合はsshサーバーの設定で実現できます。
くわしくは以下の記事で解説していますので、そちらをご覧ください。
SSH接続を送信元IPアドレスで制限するための設定手順を分かりやすく解説LinuxでIP制限する方法のまとめ
いくつか方法を解説しましたが、一番簡単なのはVPSサービスが提供するアクセス制限機能を使う方法です。
VPSサービスが提供するアクセス制限機能で一番まともなのはカゴヤVPSです。ConoHa VPSはあまり実用的とは言えず、さくらのVPSについてはセキュリティ的にアウトな仕様です。
個人的にはカゴヤVPSであれば元々用意されているセキュリティグループという機能を使ったら良いと思いますが、ConoHa VPSやさくらのVPSについてはアクセス制限機能はすべて解除した上で、ufwを使って細かくフィルタ設定をおこなうというのが一番安全だと思いますし、その方法がおすすめです。