トップページ > Apache関連 > Solaris10の最小特権機能でApache2を完全に非特権ユーザーで実行する。
カテゴリー
オラクルエンジニア通信
サポートページ
マニュアルページ
ソフトウェアダウンロード
中古UNIXマシン購入
blogs.sun.com
お勧めサイト
プライベートリンク

Solaris10の最小特権機能でApache2を完全に非特権ユーザーで実行する。

Solaris10の最小特権機能でApache2を完全に非特権ユーザーで実行する例を紹介します。

検証環境

bash-3.00# cat /etc/release
Solaris 10 5/09 s10s_u7wos_08 SPARC
Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 30 March 2009
bash-3.00# uname -a
SunOS woody 5.10 Generic_139555-08 sun4u sparc SUNW,A70

Apache2の起動

とりあえずSolaris10に標準で入っているApache2がSMF環境で正しく動くか確認してみる。
Apache2のバージョンは2.0.63のようだ。
bash-3.00# /usr/apache2/bin/httpd -v
Server version: Apache/2.0.63
Server built: Jan 18 2009 15:51:05
まぁ設定ファイルの場所などは想像できるが、
以下のコマンドでApache2サービスの起動スクリプトを確認してみる。
bash-3.00# svcprop -p start/exec apache2
/lib/svc/method/http-apache2\ start
というわけで上記ファイルの中身を確認すると、
予想通り/etc/apache2/httpd.confが設定ファイルだね。
# more /lib/svc/method/http-apache2
#!/sbin/sh
...
...
APACHE_HOME=/usr/apache2
CONF_FILE=/etc/apache2/httpd.conf
PIDFILE=/var/run/apache2/httpd.pid
...
...
というわけで設定ファイルを作成しましょ。
いつも通りテンプレートをコピーしてServerNameくらいは変更しましょうか。
ちなみにSolaris10のApache2は実行ユーザ、グループはwebservd(80)の権限で動く。
(80番ポートをバインドするメインのデーモンはデフォルトではroot権限)
bash-3.00# cd /etc/apache2
bash-3.00# ls
highperformance-std.conf httpd.conf-example ssl-std.conf
highperformance.conf magic ssl.conf
httpd-std.conf mime.types
bash-3.00# cp httpd.conf-example httpd.conf
bash-3.00# vi httpd.conf
...
User webservd
Group webservd
...
ServerName s10test <--- 適当に修正
httpd.confの修正をしたら、あとは以下のようにapache2サービスの起動をする。
サー ビスの起動方法の説明はこちら
bash-3.00# svcadm enable apache2
bash-3.00# svcs apache2
STATE STIME FMRI
online 17:57:23 svc:/network/http:apache2

bash-3.00# svcs -p apache2
STATE STIME FMRI
online 17:57:23 svc:/network/http:apache2
17:57:23 10206 httpd
17:57:24 10207 httpd
17:57:24 10208 httpd
17:57:24 10209 httpd
17:57:24 10210 httpd
17:57:24 10211 httpd
bash-3.00# ps -ef | grep httpd
webservd 10207 10206 0 17:57:24 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10210 10206 0 17:57:24 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10209 10206 0 17:57:24 ? 0:00 /usr/apache2/bin/httpd -k start
root 10206 1 0 17:57:23 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10208 10206 0 17:57:24 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10211 10206 0 17:57:24 ? 0:00 /usr/apache2/bin/httpd -k start
上記のように通常起動は確認できた。
これからが本題で上記のrootで実行されているプロセスを
Solaris10のLeast Privilege機能を使ってwebservd権限で動作するように変更する。

Least Privilege機能の適用

apache2のmanifestファイルに変更を加えてインポートする方法もあるが、今回は以下のようにsvccfgコマンドとsetpropサブ コマンドを使用して/etc/svc/repository.dbに格納されているapache2の構成を直接編集する。
以下の設定のポイントはapache2サービスのオーナーを決めるuserとgroupのプロパティーにwebservdを設定し、apache2サービ スの特権を決めるprivilegesプロパティーにnet_privaddrを追加しているところだ。
net_privaddr特権は特権付きポート番号にバインドできるようにするものだ。
Least Privilege機能の特権一覧はこちら
bash-3.00# svccfg -s apache2
svc:/network/http:apache2> setprop start/user = astring: webservd
svc:/network/http:apache2> setprop start/group = astring: webservd
svc:/network/http:apache2> setprop start/privileges = astring: basic,!proc_session,!proc_info
,!file_link_any,net_privaddr
svc:/network/http:apache2> setprop start/limit_privileges = astring: :default
svc:/network/http:apache2> setprop start/use_profile = boolean: false
svc:/network/http:apache2> setprop start/supp_groups = astring: :default
svc:/network/http:apache2> setprop start/working_directory = astring: :default
svc:/network/http:apache2> setprop start/project = astring: :default
svc:/network/http:apache2> setprop start/resource_pool = astring: :default
svc:/network/http:apache2> end
bash-3.00#
次にapache2サービスをrefreshして、apache2サービスのプロパティーが追加されたことを確認する。
bash-3.00# svcadm refresh apache2
bash-3.00# svcprop apache2
...
start/user astring webservd
start/group astring webservd
start/privileges astring basic,!proc_session,!proc_info,!file_link_any,net_privaddr
start/limit_privileges astring :default
start/use_profile boolean false
start/supp_groups astring :default
start/working_directory astring :default
start/project astring :default
start/resource_pool astring :default
...
次にwebservd権限でapache2サービスが起動できるように、以下のようにapache2サービス関連のディレクトリのオーナーやパーミッショ ンの変更をし、httpd.confファイルも適切に編集する。
変更の前にapache2サービスは停止しておく。
bash-3.00# svcadm -v disable apache2
svc:/network/http:apache2 が無効になりました。

bash-3.00# chown -R webservd:webservd /var/apache2/logs
bash-3.00# mkdir -p /var/apache2/run
bash-3.00# chown webservd:webservd /var/apache2/run
bash-3.00# chmod 775 /var/apache2/run

bash-3.00# vi /etc/apache2/httpd.conf
...
#LockFile /var/apache2/logs/accept.lock
LockFile /var/apache2/logs/accept.lock
...
#PidFile /var/run/apache2/httpd.pid
PidFile /var/apache2/run/httpd.pid
...
これでOK!
以下のようにapache2サービスを起動して、プロセスのオーナーを確認してみる。
bash-3.00# svcadm -v enable apache2
svc:/network/http:apache2 が有効になりました。
bash-3.00# ps -ef | grep httpd
webservd 10263 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10264 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10259 1 0 18:55:52 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10262 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10261 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10260 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
すべてのプロセスがwebservdで実行されている。

念のため、Apache2のエラーログファイルやSMFのログファイルもチェックしてみる。
# tail /var/apache2/logs/error_log
[Thu Jul 16 17:57:24 2009] [notice] Apache/2.0.63 (Unix) DAV/2 configured -- resuming normal operations
[Thu Jul 16 18:38:33 2009] [notice] Graceful restart requested, doing restart
[Thu Jul 16 18:38:33 2009] [warn] (128)Network is unreachable: connect to listener on [::]:80
[Thu Jul 16 18:38:34 2009] [notice] Digest: generating secret for digest authentication ...
[Thu Jul 16 18:38:34 2009] [notice] Digest: done
[Thu Jul 16 18:38:34 2009] [notice] Apache/2.0.63 (Unix) DAV/2 configured -- resuming normal operations
[Thu Jul 16 18:44:36 2009] [notice] caught SIGTERM, shutting down
[Thu Jul 16 18:55:53 2009] [notice] Digest: generating secret for digest authentication ...
[Thu Jul 16 18:55:53 2009] [notice] Digest: done
[Thu Jul 16 18:55:53 2009] [notice] Apache/2.0.63 (Unix) DAV/2 configured -- resuming normal operations

bash-3.00# tail /var/svc/log/network-http:apache2.log
[ 7月 16 17:57:23 Method "start" exited with status 0 ]
[ 7月 16 18:38:33 Rereading configuration. ]
[ 7月 16 18:38:33 Executing refresh method ("/lib/svc/method/http-apache2 refresh") ]
[ 7月 16 18:38:33 Method "refresh" exited with status 0 ]
[ 7月 16 18:44:36 Stopping because service disabled. ]
[ 7月 16 18:44:36 Executing stop method ("/lib/svc/method/http-apache2 stop") ]
[ 7月 16 18:44:36 Method "stop" exited with status 0 ]
[ 7月 16 18:55:51 Enabled. ]
[ 7月 16 18:55:51 Executing start method ("/lib/svc/method/http-apache2 start") ]
[ 7月 16 18:55:52 Method "start" exited with status 0 ]
ログファイルから、正常動作が確認できる。

さらに、従来ならrootで稼働する80番ポートをバインドしているプロセスの特権情報をpprivコマンドで確認してみる。
bash-3.00# ps -ef | grep httpd
webservd 10263 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10264 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10259 1 0 18:55:52 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10262 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10261 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 10260 10259 0 18:55:53 ? 0:00 /usr/apache2/bin/httpd -k start
bash-3.00# ppriv 10259
10259: /usr/apache2/bin/httpd -k start
flags =
E: basic,!file_link_any,net_privaddr,!proc_info,!proc_session
I: basic,!file_link_any,net_privaddr,!proc_info,!proc_session
P: basic,!file_link_any,net_privaddr,!proc_info,!proc_session
L: all
設定どおり、最小の特権で動いていることがわかる。


今回は身近なapacheで検証したが、おそらく25/tcpポートをroot権限でバインドする必要のある
sendmailなどのデーモンでも設定できるはず。

オラクルユニバーシティSolaris系技術トレーニング一覧

Solarisお勧め書籍

Solaris 11.2 システムハンドブック
Oracle Solaris 11 試験対策本(OCA)