[sudoers] CGI経由でroot権限が必要なiptablesコマンドを実行するの巻

スポンサーリンク
CentOS

一般ユーザがサクサクっとiptablesの設定変更をWeb経由でできるようにしたいなぁ(・∀・)!
と思ったのがきっかけ。

ルーターまで届いた外部(インターネット)からの通信を一度全て1Linuxサーバーに向けさせ
Linuxサーバ上のiptablesを用いて内部のそれぞれのサーバに通信を転送させようと考えました。
そうすることで、一般的なルーターでは行えない接続元の制限も出来るため管理が楽になると考えたのです!

どう?えらいでしょ(*´∀`*)?

iptablesコマンドは/sbin/配下に存在するためroot権限での実行が必要です
root権限が必要なコマンドをWebアクセスを起因として実行させる方法は主に2通りあると考えます。

ひとつは今回説明するsudoコマンドを使ってroot権限が必要なコマンドの実行を許可する方法と、
もうひとつは特定のディレクトリ配下にWeb経由でファイルを書き出せるようなCGIを設置し
そのディレクトリをcronを用いて定期的に監視
ファイルが存在する場合は特定のコマンドを実行するという方法
です。

sudoコマンドは、実行するユーザ以外の権限でコマンドを実行することができるようにするコマンドです。ユーザを指定しない場合はroot権限で実行するのがデフォルトの動作になります。詳しくはman sudoまたはこちらなどご覧ください。

今回はsudoが参照する設定ファイル、/etc/sudoers、に少々の変更を加えapacheユーザがiptablesコマンドを実行できるようにしたいと思います。

スポンサーリンク

1. 設定の確認

/etc/sudoersに直接設定を書き込んでもいいのですが管理が面倒くさく且わかりにくくなる事を避けるために他ディレクトリを参照するようにしたいと思います。

既に他ディレクトリを参照する設定がされているか確認を行います。

# grep "#includedir" /etc/sudoers

抵の場合「#」から始まる行はコメントアウトとして認識されない行となりますが
この場合は「#includedir」という記述自体が他ディレクトリを参照させる記述となります。

[root@vps1 ~]# grep "#includedir" /etc/sudoers
#includedir /etc/sudoers.d
[root@vps1 ~]#

2. 設定の変更

※上記1にて設定を確認した際にもし既に設定がされている場合は変更を加える必要はありません

「#includedir」の設定がされていなかった場合に限り以下の方法で設定を行います。

# mkdir /etc/sudoers.d
# cp -p /etc/sudoers /etc/sudoers.`date +%Y%m%d`
# echo "#includedir /etc/sudoers.d" >>  /etc/sudoers

上記コマンドは/etc/sudoers.dディレクトリを作成し、/etc/sudoersのバックアップを作成し、最後に「#includedir /etc/sudoers.d」の記述を/etc/sudoersに追加しています。

変更が正しくされているか確認を行う場合はdiffコマンドを用います。以下のような結果が確認できれば成功しています。

[root@vps1 ~]# diff /etc/sudoers /etc/sudoers.20120816
95d94
< #includedir /etc/sudoers.d
[root@vps1 ~]#

3. apacheユーザがiptablesコマンドを実行できるようにする

ここがメインの作業となります。

1. /etc/sudoers.d/apache ファイルを作成する。

# touch /etc/sudoers.d/apache
# chmod 440 /etc/sudoers.d/apache

2. /etc/sudoers.d/apacheに以下を記述します

Defaults:apache !requiretty
Cmnd_Alias IPTABLES = /sbin/iptables
apache ALL = (ALL) NOPASSWD: IPTABLES

4. テスト用のCGIを設置しiptablesが実行出来るか確認する

今回はPHPを用いて試します。

以下の記述を書いたファイルを「.php」の拡張子で保存(例:iptables-L.php)し
Web経由でアクセス出来る場所に設置してアクセスしてみましょう。

ここで「sudo」を利用することを忘れないように!

<?php
 $result=`sudo iptables -L`;
 print "<pre>$result</pre>";
?>

上記の記述はiptables -Lの実行結果を表示します。
表示ができればiptables -Lが正しく実行されていることがわかります。

以上がCGI経由でroot権限のコマンドを実行させるための手順となります。
これはiptablesコマンド意外にもserviceコマンドやshutdownコマンドを利用する場合にも有効な方法です。

以上

コメント

  1. くりくり より:

    どう?えらいでしょ(*´∀`*)?

    えらいです(w
    俺は一般ユーザーがアカウント管理なんかもやってもらいたいので管理が楽になるとかんがえました(w

  2. trippyboy より:

    サーバーの様子が悪い時にはひとまず再起動してみてくださいとか言えるし、Webアクセスできる環境があれば管理者自身もメンテナンス出来ますからね!(((o(*゚▽゚*)o)))

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