デスクトップへのリモートアクセスをセキュア化する

 自宅のサーバに外から安全にアクセスしようとすると(特に固定IPアドレスを持たない場合は)問題が起こる可能性があるが、Linux、PAM、NX Freeを使えば安全なリモートアクセス環境を作り出すことができる。

 数か月前、自宅のあるウルグアイのモンテビデオからニューヨークに出向く用事があった。国外で数週間過ごすことになったため、自宅のサーバにアクセスできることを確認しなければならなかった。Linuxは安定しているとはいえ、自宅に残った家族が問題に見舞われることも考慮しなければならなかった。私がニューヨークから電話やメールで対策を指示できるとは限らないからだ。

 すべてをうまく運ぶために、私は3つの問題を解決する必要があった。まず、自宅では固定IPアドレスなしのASDL接続を利用しているが、これは私のアドレスが変わり得ることを意味するため、IPアドレスがわからなくても私のマシンにアクセスできる必要があった。次に、SSHを使うことはできたのだが、SSHポートを開けたマシンに攻撃を試みる人が少なくないことを知っていた。私は自分のマシンを攻撃にさらしたくはなかった。さらに、NoMachineのNX Free Editionの噂を耳にしていて一度試したいとは思っていたが、今回はこれを間違いなく安全に使えるようにする必要があった。

固定IPを持たないマシンにアクセスする

 固定IPアドレスを持っていないのは厄介なことだが、簡単な解決策がある。それがDynamic Network Servicesの提供するDynDNSだ。このフリーのサービスでは、移ろいゆく可変IPアドレスを備えたコンピュータを参照するサブドメインを持つことができる。そのためには、クライアントのホスト名と現在のIPアドレスを最新の状態に維持するちょっとしたアップデートクライアントをインストールするだけだ。このクライアントは、IPアドレスが変わるたびに中央のサーバに通知してくれる。最新のルータの多くでは、ルータ自身でこうした通知を行うように設定することで、このクライアントがなくても同じことができる。

 DynDNSサイトに行き、フリーのアカウントでサインアップして、ドメインを選ぶ(私が選んだのはremotekereki.homelinux.com)。また、指示に従ってDDclientプログラムという、DynDNSを最新の状態に維持する短いPerlスクリプトを入手する。DDclientのインストールは簡単だ。コードを手に入れ、/usr/sbinに復元して(rootとして実行する必要がある)、/etc/ddclient/ddclient.confを編集して以下のようなサイトの詳細情報を記入する。

pid=/var/run/ddclient.pid
daemon=600
protocol=dyndns2
use=web, web=support.easydns.com/utils/get_ip.php
server=members.dyndns.org
login=<自分のユーザアカウント>
password=<自分のパスワード>
<自分のドメイン名>

 さらに、rootとしてchkconfig ddclient on/etc/init.d/ddclient startを順に実行して、準備を整えた。すべてが正常に動作していることを確かめるために、ping remotekereki.homelinux.comを実行したところ、きちんと応答が得られた。つまり世界中のどこでも私のアドレスが使えるようになったのだ。こうして最初の問題は解決された。

SSHによるアクセスをセキュア化する

 PAM(Pluggable Authentication Module)は、セキュリティに関する柔軟性を高める重要な鍵である。かつて認証を行う唯一の方法は、ユーザにパスワードを入力させて/etc/passwdファイルに格納されている正式なパスワードとの一致をチェックすることだった。今では、/etc/passwdファイルに代わるもの、スマートカードその他のハードウェアデバイスなど、ほかにも多数の手法がある。これらの手法をサポートするプログラムすべてを書き直す代わりにPAMをインストールすれば、必要なチェックが透過的に行われる。

 私はアクセスにある程度制限を加えたかったので、/etc/pam.d/sshdファイルの最後に次の行を追加した。

#%PAM-1.0
auth     include        common-auth
auth     required       pam_nologin.so
account  include        common-account
password include        common-password
session  include        common-session
account  required       pam_access.so

 pam_accessモジュールは、/etc/security/access.confファイルに基づく追加のセキュリティ制御を実現する。私のマシンにアクセスできる人を指定するために、このファイルの編集を以下のように編集した。

+ : ALL : 192.168.
+ : remote1776 : ALL
+ : nx : ALL
- : ALL : ALL

 最初の行は、だれでも(”ALL”)私のマシンに自宅の内部ネットワークの範囲内からログインできることを意味する。2行目はremote1776というユーザが世界中のどこからでも私のマシンにアクセスできるようにするもので、3行目はそれと同じ権利をNX Freeで使用するnxユーザに認めるものだ。また、最後の行は、これらの行で指定されていない者すべてのアクセスを無効にする包括的な指定方法である。

 remote1776というのは、私自身がマシンに入れるための最小限の権利だけを持たせるために私が作成したアカウントである。suを実行することで私自身、あるいは必要であればrootとして作業できる。そのため、たとえremote1776の正しいパスワードを推測できたとしても、それだけではあまり意味がなく、ほかのもっと有用なユーザのパスワードも推測しなければ、侵入者が深刻な害を及ぼすことはできない。

 今度は、これらすべてを使用するためにSSHの設定を行う必要がある。私は/etc/ssh/sshd_configファイルのうち、以下の行を編集した。

Port 16949
Protocol 2
PermitRootLogin no
MaxAuthTries 3
UsePAM yes

 これらの行はすべて上記ファイルに存在するので、ファイル内を探す必要がある。最初の行はSSHの標準のwell-knownポート(22)を別のポート番号に変えるため、侵入者による推測が難しくなる。ただ、すでに使われているポートを選ばないように注意すること。私の場合、ファイアウォールでもこのポートを開けておいた。

 protocol 2という行は、少し貧弱なプロトコルの使用を回避するためのものだ。3行目は、ほとんど説明の必要がないだろう。私は誰もrootとしてログインさせたくなかったのだ。侵入者にそうやすやすと悪事を働かれては困る。ログインを三度試みてもうまく行かない場合は、タイムアウトによってブルートフォース・アタック(総当たり攻撃)は封じられる。また、最後の行は、SSHでPAMの設定を使用するためのものである。

 この場合、/etc/init.d/sshd restartによってsshを再起動する必要があり、その後はssh remote1776@remotekereki.homelinux.com:9622を実行すれば私のマシンにアクセスできるようになる。それにしても長いコマンドだ。

NX Freeを使用する

 以上の作業がすべて済めば、NX Freeによって追加の制約を設けるのはたやすい。NX Freeは独自のセキュリティ手法を実現しているが、私は2点の変更を加えた。まず、nxユーザを許可されたユーザのリストへ追加した。次に、接続の定義時に、その標準ポート(22番)を自分用の新しいポート(16949番)に変更した。やるべきことはこれで全部だ。もちろん、インストールされているインフラストラクチャのすべてを活用するつもりなら、セキュリティ増強のために余分な作業はしないほうがよいだろう。

 ここで紹介したやり方すべてを習得するまではひと手間かかったが、それらを連携させるのは比較的簡単かつ効果的である。かくして、私は何の問題もなくニューヨークから自分のデスクトップマシンを使い、家族が遭遇したいくつかの問題を解決して、出張中は一切の侵入を受けることなく自分のマシンを「オープン」な状態にして過ごすことができたのだった。

Federico Kerekiはウルグアイ在住のシステムエンジニアで20年以上に及ぶシステム開発の経験がある。現在はコンサルティング業と大学での教育に従事。

linux.com 原文