LinuxにおけるMascotクラスターシステムのセキュリティ
Mascot Server ではクラスターモードが利用可能です。 ネットワークで接続されたPCクラスターシステムで、データベース検索を並行して実行させることができます。クラスターシステムに特別なハードウェアやOSは必要なく、Windows または Linux が搭載されている一般的な商用PC を利用可能です。マスコットサーバーのクラスターモードでは1台のコンピューターがマスターノードとして、それ以外のコンピューターを計算ノードとして利用します。
Linux 版 Mascotではメインプログラムの実行を root で行う事を前提としています。 しかし最近の Linux ディストリビューションでは root アカウントが無効になっていることが多く、またrootでMASCOTを動かす仕組みではセキュリティ上に不安を感じる方もいらっしゃるかと思います。この記事ではMascot クラスターシステムをroot ユーザー以外で実行するためのヒントをいくつか集めました。
クラスターのデフォルト動作
マスターノードでは MASCOT動作プログラムの本体であるms-monitor.exe を実行し、そこからload_node.plスクリプトを介して計算ノードを制御します。スクリプトは計算ノード上での計算を担う ms-mascotnode.exe の起動と停止に SSH を使用します。またscpコマンドを利用して配列データベースファイルと設定ファイルを計算ノードにコピーします。
初期設定でのMASCOTプログラムをスタートする順序は以下の通りです。マスターノードのコンピューターを master-pc, 計算ノードコンピューターをworker-pc と表現します。
- master-pc上で、ms-monitor.exeがrootとしてload_node.plを呼び出し、root@worker-pcへSSH接続
- master-pcにおいて、SSHがmaster-pc:/root/.sshにある秘密鍵を確認
- worker-pcにおいて、SSHはworker-pc:/root/.sshにある公開鍵を使って認証
- SSH通信が確立された後worker-PC上においてms-mascotnode.exeがrootとして起動
ms-mascotnode.exeが起動すると、専用通信を行うTCPポートを開きます(デフォルト設定では 5001番を割り振っています)。このポートは検索エンジンのプログラム nph-mascot.exeが、各計算ノードに割り振った入力データ、計算の進捗状況の情報、計算結果を計算ノードと受け渡しするために使用されます。計算ノード上において、nph-mascot.exeはms-mascotnode.exeの認証情報を継承します。 関連する認証情報は次のとおりです。
- nph-mascot.exeはmaster-pc上のCGIユーザー(通常はapacheまたはwwwまたはwwwrun)として実行。
- nph-mascot.exeは、worker-pcのポート5001に接続
- ms-mascotnode.exe がworker-pc上で、ポート5001経由で検索データを受信し、rootとしてnph-mascot.exeを起動
load_node.plを正常に動作させるため、パスワードの無いSSH接続ができる状況を必要としますが、これはms-monitor.exeがコンソールにアクセスできないデーモンプログラムまたはシステムサービスとして動作するためです。しかしパスワードレスのSSHを使用するシステムであるがゆえに、master-pc上でrootとしてログインできる人または「su」でroot同様のコマンドが実行できるユーザーは、計算ノードにも無制限にrootでアクセスできてしまう事になります。
非特権ユーザーとしての実行
MASCOT クラスターシステムは、計算ノードpcがすべてクローズドなプライベートネットワークに属し、master-pcからしかアクセスできない前提で考えられています。その場合計算ノードへ外部から侵入するためには、master-pcのrootアカウントからしかアクセスできず、セキュリティ的に穴はありません。
一方様々な事情により、nodeが閉じたネットワーク上に設置させる事ができないケースもあるかもしれません。その場合でも、少なくともマスター・計算ノード共に信頼できるネットワークの中(大学キャンパス内など)に置く必要があります。外部からの侵入はファイアウォールで保護されますが、ネットワーク内の誰もが計算ノードにもアクセスできるようになっている点にご注意ください。 またもし誰かが ms-monitor.exeプログラムのセキュリティホールを見つけ任意のコマンドを実行する方法を見つけた場合、計算ノードにおいて簡単に root 権限を取得することができてしまいます。
ブログ記事「Improved security for Mascot Installations under Linux」には、非特権ユーザーとして ms-monitor.exe を実行する方法が記載されています。例えばマスターノード上でms-monitor.exe をmascot ユーザーとして実行した場合、サービスの起動は次のように変わります。
- ms-monitor.exeはload_node.plをmascotユーザーとして呼び出し、root@worker-pcへのSSH接続を開きます。
- マスターノードでは、SSHがmaster-pc:/home/mascot/.sshにある秘密鍵を探します。
- 計算ノードでは、SSHでrootのホームにある公開鍵を使って認証し、rootとしてms-mascotnode.exeを起動します。
ms-monitor.exeを少ない権限を持つユーザーで実行していますが、このままでは状況はむしろ先程の例よりもセキュリティ的に悪化しています。マスターノードのmascotユーザーとしてログインできる人は誰しも計算ノードに対してroot権限でアクセスが可能になっているためです。mascotなどの非特権アカウントは、rootアカウントよりもセキュリティ要件が低く、セキュリティ的に突破されやすいと言えます。
上記内容と関連していますがさらに発展して、計算ノード上でms-mascotnode.exeをmascot-workerユーザーとして実行する方法を考えます。そのためにはまず、計算ノード上でnodelist.txtにて指定されたmascotノード用のディレクトリについて、ユーザーmascot-workerが書き込み可能となるよう設定を変更してください。 mascotノード用のディレクトリはデフォルトではusr/local/mascotnodeです。そしてSSH公開鍵を worker-pc:/home/mascot-worker/.ssh に追加します。 その後load_node.plを編集し、スクリプト内で"root"として指定している箇所をすべて「mascot-worker」に変更します。こうするとmascotのスタートアップは以下のような手順を経て実行されるようになります。
- マスター上でms-monitor.exeが、mascotユーザーとしてload_node.plを呼び出し、mascot-worker@worker-pcへのSSH接続を開きます。
- 計算ノードで、SSHによりworker-pc:/home/mascot-worker/.sshにある公開鍵を使って認証します。
- 計算ノードでは、ms-mascotnode.exeがmascot-workerとして起動します。
nph-mascot.exeはms-mascotnode.exeの認証情報を継承しており、ノード上のデータベース検索はmascot-workerとして実行されます。
IPアドレスによるアクセス制限
マスターノードと計算ノードは互いの通信のため固定IPアドレスを持っている必要があります。 対象コンピューターのIPアドレスはマスター上でnodelist.txtファイル内で指定します。コンピューターとIPアドレスの紐づけがしっかりされているので、セキュリティ的にはIPアドレス情報を使ってSSHアクセスを制限するのが良いといえるでしょう。例えば計算ノードのauthorized_keys に「from」オプションを追加します。ソースIPまたはホスト名がマスターノードの場合にのみ、パスワードなしでのログインを許可します。詳細については、sshd(8)マニュアルを参照してください。
ポート5001の確保
MASCOTクラスターの各コンピューターをすべてインターネット上に設置してクラスターシステムを組むのはお勧めできません。SSH はそれなりに安全ですが、mascotクラスターではカスタムの TCP プロトコルをポート5001で使用していてデータは暗号化されていません。故意あるいは偶然に、計算ノード上のms-mascotnode.exe をクラッシュさせたり、特権の昇格をさせてしまうような攻撃をされてしまう可能性があります。
Mascot クラスターをパブリック クラウドなどの公共ネットワークに設置しなければならない場合は、これまで述べてきたように、非特権ユーザーとしてプログラムを実行し、ルートアクセスを無効にしてIPアドレスによるログインを制限することが不可欠です。しかしそれでもポート5001を介したトラフィックを保護しきれません。
ポート5001の対処法となる候補の一つとして、マスターノードと計算ノードの間に仮想プライベートネットワーク(VPN)を設定する方法が挙げられます。ほとんどのクラウドプロバイダーでプライベートネットワークを提供していて、仮想プライベートクラウド(VPC)と呼ばれることもあります。あるいは、IPsecやOpenVPNを使ってOSレベルで設定することもできます。そしてマスターと計算ノードの通信は、VPNアダプタのIPアドレスを使用するようnodelist.txtを設定してください。更に計算ノード側でOSのファイアウォール機能を使用して、VPNアダプタを経由しない限りポート5001で通信できないように設定すると良いでしょう。
Mascot SecurityとWebサーバセキュリティの比較
上記のヒントは低階層のシェルアクセスに関するものです。これとは別にWebセキュリティについても考慮する必要があります。MASCOTに同梱されているApacheの設定例は暗号化されていない HTTP (ポート 80) の使用を想定しています。Apache ドキュメントを参照してHTTPS を有効にし、クライアント 認証を設定してご利用頂く事もできます。HTTPに関する設定方法についてはApache のドキュメントを参照してください。
さらにMascot にはMascot セキュリティと呼ばれるロールベースのアクセス制御機構も備えています。これ自体は強力な認証システムではありませんが、その詳細については、過去のブログ記事「シングルサインオン(SSO)とMascot」(英語版、日本語版)を参照してください。