第2回 オリジナルセキュリティモジュールの作成
村上 純一
株式会社フォティーンフォティ技術研究所
研究開発部 αUnit シニア・リサーチエンジニア
2008/4/24
サーバ接続に基づきアクセスを制御する「Root Connect」
Root Connectは、ベンダIDとプロダクトIDの代わりに、サーバのIPアドレスとTCPのポート番号を指定して、ネットワーク上に存在するサーバへの接続を利用してアクセス制御を行います。
アプリケーション層でのプロトコルは実装しておらず、単純なTCPレベルでの3ウェイハンドシェイクの成否が、root権限でのコマンド実行の可否に直結します。そのため、リモートのサーバ上で動作するサーバプログラムのオン/オフによって、root権限でのコマンド実行の許可/不許可を制御することができます。
実装はRoot Plug同様、bprm_security_checkフックを利用して、実行するプログラムの実効グループIDに基づいた処理を行っています。Root Connectのbprm_security_checkフックのコールバック関数をリスト4に示します。
|
|
リスト4 rootconn_bprm_security_check関数 |
3行目で、Root Plugのときと同様、実効グループIDが0(root)でないかどうかをチェックし、0であった場合は、connect_server関数を呼び出します(リスト5)。
|
|
リスト5 connect_server関数 |
connect_server関数では、11行目のsock_create_kern関数でTCPソケットを作成し、続く21行目のkernel_connect関数でTCPソケットによるサーバへの接続を行います。接続処理が失敗した場合は、TCPソケットの開放を行い、エラー値を返却します。接続に成功した場合は、linux_binprm構造体のポインタから実行するプログラムのファイル名を参照し、接続先のサーバに送信します。
次に、Root Connectのビルド手順を以下に示します。
1.root_conn.cをsecurity/に配置します。
2.Root Connectのターゲットを、security/Makefileの最終行に次のようにして追加します。
obj-$(CONFIG_SECURITY) += security.o dummy.o inode.o |
3.security/KconfigにSECURITY_ROOTCONNシンボルを追加します。
config SECURITY_SECLVL |
この状態でmake menuconfigコマンドを実行すると、Security optionsのカテゴリに「Root Connect Support」のエントリが追加される状態となります。これをモジュールにするよう選択し、以下のコマンドを実行します。
% make security/root_conn.ko |
サーバプログラムを用いて挙動をテスト
Root Connectの接続先として指定するサーバは、TCPレベルでの接続性さえ存在すればどんなものでも構いません。
今回は、せっかくですから専用のサーバプログラム(以降、RootConnServer)を用意しました。RootConnServerは、forkを利用したシンプルな並行サーバになっています。クライアントからのTCP接続を受け付けると、送信されたデータを受信して、標準出力に表示します。
では、実際にroot_conn.koとRootConnServerを利用してみましょう。
まず、RootConnServer.cをネットワーク上の適当なサーバにコピーし、ビルドします。
・サーバ側(192.168.1.10)
% gcc -Wall RootConnServer.c -o RootConnServer |
サーバ側でRootConnServerを起動し、クライアント側でRoot Connectをカーネルにロードします。ロードする際には、addr、portパラメータを用いて、サーバのアドレスとポート番号を指定する必要があります。
・サーバ側(192.168.1.10)
% ./RootConnServer |
・クライアント側(192.168.1.1)
% sudo modprobe root_conn addr=192.168.1.10 port=1111 |
Root Connectロード後に、sudoコマンドからwhoamiコマンドを実行するとRootConnServerが以下のような出力を行います。
2008-04-05 08:47: 192.168.1.1:3775 /usr/bin/whoami |
また、クライアント側にRoot ConnectをロードしたままRootConnServerを停止すると、Root Plug同様、root権限でのコマンド実行が制限されることを確認できます。
なおRoot Connectは、原理上、接続先のサーバやサーバに接続するためのネットワーク自体に障害が発生した場合、クライアント側でのroot権限によるコマンド実行が一切できない状態になります。動作確認を行う場合は、検証環境を用意したうえで実行してください。
アイデア次第で広がるモジュール
いかがだったでしょうか? Root Plug、Root Connectどちらも実環境で利用するためには、いろいろと手を加える必要がありますが、セキュリティモジュールの開発にチャレンジするには良い足掛かりではないでしょうか。どちらも利用しているのは、まだLSMのほんの一部の機能だけですから、アイデア次第で、もっと面白いことができると思います。
次回は、Root Connectにさらにいくつかの機能拡張を加えていきましょう。
2/2 |
|
||||
|
Linux Squareフォーラム Linux/システム学習関連記事 |
連載:Windowsユーザーに教えるLinuxの常識(全12回) Windowsのセオリーが通用しないLinux。Linux初心者向けに、LinuxというOSの考え方/常識をゼロから伝授! |
|
連載:LFSで作って学ぶLinuxの仕組み(全4回) 管理者(root)は、何をしなければならないのか? 管理に際して検討すべきことは? 管理のための技術とは? など、駆け出し管理者のための考え方や方法論を検討する |
|
連載:Linux管理者への道(全8回) 「Linux From Scratch」というシンプルなLinuxをインストール&環境構築する作業を通して、LinuxがOSとして機能するための仕組みや設定を見直そう |
|
Linux Squareフォーラム全記事インデックス |
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|