VPSサーバーへのSSH接続をIPv6で制限する~操作するPCのIPv6アドレスをDDNSでコントロール

Linux

現状のVPS構成について

当サイトはVPSにdebian GNU Linuxをインストールし、Apache+MySQL環境でWordpressを使っています。GUI(X-Window)はインストールしておらず基本的にコマンドのみの操作環境です。

でも、実際の操作は主にWindowsパソコンからPuTTY、WinSCPで行うのでファイル転送等の一部操作はGUIで操作出来ています。PuTTYからは当然コマンド入力となりますが特に不自由はしていません。

SSHでの接続について

VPSへの接続はいずれもSSHです。WinSCPでSSH接続しておいてWinSCPのセッションを使ってPuTTYを接続できるのでPuTTYでの接続手順は省略できます。ひと手間減るので結構便利です。

VPSのセキュリティ対策(レベルを少し上げてみた)

私が借りているVPSはインターネット上に公開されている状態なので、セットアップした頃にログを確認して見ると結構攻撃されている様が記録されていました。そこでひと手間加えて、SSHで接続できるISPに制限をかけておくことにしました。

以前は「/etc/hosts.allow」に下記の様な記述を加えて接続を許可するプロバイダを制限していました。これでも世界中から接続を試みられる対策としては意味があると思っています。

sshd : .kochi.ocn.ne.jp .dynamic.ppp.asahi-net.or.jpCode language: CSS (css)

上記の例だと、OCN(高知)とASAHINETの接続を許可する意味で記していました。一時期、Wi-MAXルーターを携行して出先から接続することもあったので下記の様に追記したこともあります。(現在はWi-MAXは使っていませんのでau-netからの接続許可は消しました)

sshd : .kochi.ocn.ne.jp .dynamic.ppp.asahi-net.or.jp .au-net.Code language: CSS (css)

/etc/hosts.allowと/etc/hosts.denyの組み合わせは手軽なので便利だと思います。ちなみに/etc/hosts.denyは下記の様にしていてデフォルト全て拒否としています。こうしておけば/etc/hosts.allowに記したネットワークからだけ接続を許可できます。

sshd : ALL

DDNSを使えば更に強固にできる

一般人が使うネットワークといえば、普通のISPでインターネット接続回線の契約をして使うと思うので、先に記したISP単位での接続制限が現実的な範囲だと思いますが、もうちょっと工夫すると更に強度を上げることが出来ます。DDNSを使えば固有のPCだけからの接続を許可する仕組みにもできると考えました。

例1:iobb.netのDDNSサービスを使う

一例を上げれば、我が家ではI-O DATAのブロードバンドルーターを使っているので、そのルーターに備わっている「iobb.net」というサービスを利用すれば、ブロードバンドルーターに割り当てられたグローバルIPアドレスをDDNSで解決することが出来そうです。これをVPS側に設定しておけば、自宅以外からの接続を拒否することが出来ます。自宅以外からVPSに接続しないのであればこれで事足りるかなと思います。後はVPS側の/etc/hosts.allowで許可しておきます。非常に手軽です。

sshd : sasapurin.iobb.netCode language: CSS (css)

例2:OPEN IPv6 ダイナミック DNS for フレッツ・光ネクストを使う

もっとピンポイントに接続を制限する方法として考えたのは、使用しているPCからのみ接続を許可する仕組みで、Open IPv6 DDNSを使う方法です。このサービスは無料で使用できるので非常にありがたいです。

最近のWindows、Mac、LinuxはIPv6を使うことができるので、ルーターがIPv6をパススルーできるならこれを使わない手はないかなと思っています。かなりガチガチに制限できる割に手軽です。

まずこのサービスの利用方法を調べて、最初にVPS側に一工夫しておく必要はありますが、一度済ませておけば接続の前にDDNSで操作するPCのIPv6アドレスを解決しておくだけの手間しかかかりません。

私が考えたのは、VPS(Linux)側で自動的にIPv6 DDNSサービスで名前解決をさせて、/hosts.allowに記しておく方法です。しかし/etc/hosts.allow内でDDNSの名前解決をさせる方法がわからなかったので、外部で名前解決をしてファイルに書き出し、/etc/hosts.allowはそのファイルを参照する様にしました。

/home/sasapurin/MyIPv6Addressというファイルに書き出すことにします。/etc/hosts.allowには下の様に記しました。これでMyIPv6Addressファイルを更新すれば上手く出来ます。

sshd : /home/sasapurin/MyIPv6AddressCode language: JavaScript (javascript)

ファイルに接続許可したいPCのIPv6アドレスをファイルとして保存させる方法です。基本的にシェルスクリプトで十分だと思うので、実行はcronを組み合わせれは、5分毎にとか柔軟に対応できると考えました。

実験1:hostコマンドで検証

VPS側で名前解決をするために、hostコマンドを実行してみます。

sasapurin$ host sasapurin.i.open.ad.jp
sasapurin.i.open.ad.jp has IPv6 address 2405:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:3e10

こんな感じで名前解決をしてくれることが分かったので、操作しているWindowsパソコンのIPv6アドレスと一致していることを確認しました。上手く出来たのでこの方法(hostコマンド)を使うことにします。

実験2:シェルスクリプトに手順を記す

あとはシェルスクリプト内で、awkを組み合わせれば目的とするIPv6アドレス(5カラム目)を抜き出すことができそうです。適当なシェルスクリプト名「MyIPv6Address.sh」を作って実行してみました。

#!/bin/bash
IPv6=$(/usr/bin/host sasapurin.i.open.ad.jp | awk '{print $5}')
echo [${IPv6}] > MyIPv6AddressCode language: JavaScript (javascript)

やっている事は単純で、hostコマンドを実行して名前解決し、そのレスポンスの5カラム目をawkで抜き出して、echoでMyIPv6Addressファイルに書き出しているだけです。cronに登録して5分毎に実行させることにしました。最大5分の待ちが発生しますが追々調整していけば良いかなと思っています。

実験3:使い方(ひと手間かかる)

Windows PCを再起動してIPv6アドレスの割り当てを更新してみます。ipconfig /allで割り当てられたIPv6アドレスが確認できます。変更されていたのでこれを「OPEN IPv6 ダイナミック DNS for フレッツ・光ネクスト」に通知する必要があります。この辺りはサービスの利用方法を確認してもらうしかありませんね。いくつかの方法が紹介されています。

私が採用したのは、Webブラウザで指定のURLにアクセスしてIPv6アドレスを通知(DDNSを更新)する方法です。Webブラウザのブックマーク(お気に入り)に入れておけばワンクリックで更新できます。

勇み足でVPSに接続してみましたが、しばらく待たないとDDNSの更新とVPS側の更新がかからないので、接続がブロックされました。つまりセキュリティが動作しているという事です。5分待ってからWinSCP、PuTTYでVPSに接続してみたところ上手く接続できました。Webブラウザを起動してDDNSの更新、そこから5分待つというのが手間ではありますが、セキュリティレベルは格段に上がったはずなのでこれで良しとします。

残る課題

私が使っているWindowsパソコンは、使わない時はスリープする様に設定しているので、スリープから復帰した時に、自動的にDDNSの更新をしてほしいです。つまりWebブラウザを起動してDDNSの更新をするために指定のURLにアクセスする手間を省きたいです。

更に最大5分待たないといけないので、VPSに接続して作業をしたいと思い立った時に、最大5分待たないといけないというのはモチベーション面で障壁なので改善の余地があると思ったわけです。

VPSの負荷は大したことないと思うので、例えばcronによる実行を1分起きに更新させるのでも良いかも知れませんが、なんとなく5分置きに更新位に留めておきたいという思いもあります。Windowsパソコンをスリープから復帰させた時に、BATファイルか何かを走らせれば良いんじゃないかと思う次第です。

おそらくイベントビューアにはスリープから復帰したログが残るはずなので、それをトリガーにしてスケジュールで実行させればいいんじゃないかなと漠然と考えています。明日にでも時間があったら調べてやってみようと思います。(元旦早々そんな事してて良いのか?という気もしますが普段は時間的余裕が無くてできないのでね)

コメント

タイトルとURLをコピーしました