2009年6月 6日

[jsosug:00095] Re:CentOS-5.3 にて SSH ログインとローカルログインでSELinuxの権限を分けることは可能でしょうか

海外です。

遅くなりましたが、SSHログイン/ローカルログインで権限を分けるという事を
やってみました。

その前に、頂いた質問に答えていなかった。(^^;

>> まず、sshd が unconfined_t ドメインで動作しています。

>> --------
>> [kaigai@xxxxx ~]$ ps -AZ
>> :
>> system_u:system_r:local_login_t:SystemLow-SystemHigh 3195 ? 00:00:00 login
>> :
>> system_u:system_r:unconfined_t:SystemLow-SystemHigh 4174 ? 00:00:00 sshd
>> :
>> --------
>> ただ、ローカルのログインは local_login_t で動作しているので、
>> 上記の設定ファイルで「system_r:local_login_t:s0-s0:c0.c1023」のエントリと、
>> 「system_r:unconfined_t:s0-s0:c0.c1023」のエントリを分けて記述する事が
>> できるでしょう。
>
> ここがいまいち理解できていないのですが、local_login_t で起動したシェルな
> どのドメインを unconfined_t から local_login_t に変更することにより、
> SSHD によるログイン(unconfined_t)と区別させる。ということでよろしかっ
> たでしょうか。

いえ、違います。ちょっと舌足らずだったので、step by step で説明します。

sshdやloginは、利用者からの接続を受け取ると、パスワード等でこれを識別・認証します。

次に、利用者の認証をパスすると、sshd/loginはログインシェル用に子プロセスを fork()
します。この段階では、子プロセスのセキュリティコンテキストは sshd/login と同じです。

次に、シェルを execve() する前に、sshd/loginは利用者に適した権限を割り当てます。
これは、root(uid=0)で動いていたプロセスが、一般ユーザのuidに変更してからシェルを
実行するのと同じイメージで考えて下さい。

この時、sshd/loginは『どのセキュリティコンテキストに変更したらいいのか?』を
知る必要があります。それを書いてあるのが、前のメールで紹介した下記のファイルです。

- /etc/selinux/targeted/contexts/users/<SELinuxユーザ名>
- /etc/selinux/targeted/contexts/default_contexts

この段階でユーザ認証は済んでいますので、"SELinuxユーザ名"は確定しています。
Cent5.3では、非rootは全て user_u とというデフォルト値が与えられています。

したがって、sshd/loginは最初に
/etc/selinux/targeted/contexts/users/user_u
を参照します。

でも、デフォルトではこのファイルは存在しませんので、次に
/etc/selinux/targeted/contexts/default_contexts
を参照します。

このファイルには以下のように書かれています。
----------------
[root@xxxxx users]# cat /etc/selinux/targeted/contexts/default_contexts
system_r:crond_t:s0 system_r:unconfined_t:s0
system_r:initrc_t:s0 system_r:unconfined_t:s0
system_r:local_login_t:s0 system_r:unconfined_t:s0 ← ★
system_r:remote_login_t:s0 system_r:unconfined_t:s0
system_r:rshd_t:s0 system_r:unconfined_t:s0
system_r:sshd_t:s0 system_r:unconfined_t:s0
system_r:sysadm_su_t:s0 system_r:unconfined_t:s0
system_r:unconfined_t:s0 system_r:unconfined_t:s0 ← ☆
system_r:xdm_t:s0 system_r:unconfined_t:s0
----------------

左側が『デーモンの動作しているロール/ドメインの組』
右側が『そのデーモン経由でログインした時のロール/ドメインの組』です。

まず、sshd経由でログインした場合。
sshdは system_r:unconfined_t ドメインで動作しています。
(Cent5.3ではsshd_tではありません。)
したがって下から2行目のエントリにマッチし、その結果、sshdは子プロセスの
ドメインを system_r:unconfined_t に変更してシェルを起動します。

次に、login経由でログインした場合。
loginは system_r:local_login_t ドメインで動作しています。
したがって上から3行目のエントリにマッチし、その結果、loginは子プロセスの
ドメインを system_r:unconfined_t に変更してシェルを起動します。

結局デフォルトでは、ローカル/リモートのログインが共に unconfined_t を
使うように設定されているという事ですね。

> デフォルトではローカルログインしたシェルもリモートログインしたシェルも
> unconfined_t で動いていますよね?

とういう事でよろしいでしょうか?(^^;


>> ですので、手順としては以下のようになるかと思いますが、もう少しポリシー等
>> 調査してリーズナブルな設定方法を後日紹介したいと思います。
>>
>> 1. /usr/share/selinux/devel/include/system/userdomain.if で定義されている
>> テンプレート等を利用して、制限つきシェル用のドメインを作成する。
>> (仮に staff_t とします)
>> 2. 上記のポリシーをモジュールとして作成し、これをインストールします。
>> (モジュールの作成/ビルド方法のメモも必要ですね)
>> 3. /etc/selinux/targeted/contexts/users/user_u に、sshd経由でログインした
>> 場合に、シェルに staff_t を割り当てる設定を記述する。
>
> すみません、お手数お掛けします。このようなアプローチができるのですね。
> ここら辺になると全くついて行けていませんが、とりあえず
> selinux-policy-devel パッケージの存在に気づけただけでも質問した甲斐があ
> りました。色々と眺めてみたいと思います。

というわけで、やってみました。

1) まず、制限つきシェル用のドメインを作成します。
以下のファイルを作成し、confined.te という名前で保存して下さい。

----------------(キリトリセン)----------------
policy_module(confined, 1.2)

gen_require(`
type unconfined_t;
type user_home_t;
type user_home_dir_t;
')

#
# create confined_t and related types using policy template
#
userdom_unpriv_user_template(confined)

#
# allow to translate sshd (unconfined_t) -> confined_t domain
#
allow unconfined_t confined_t : process { transition };

#
# allow to use terminal devices
#
term_use_all_terms(confined_t)

#
# allow to use user home directory type
#
userdom_user_home_dir_filetrans(user, confined_t, user_home_t, dir_file_class_set)
userdom_manage_user_home_content_files(user, confined_t)
----------------(キリトリセン)----------------

2) このポリシーをビルドします。
なお checkpolicy と selinux-policy-devel パッケージが必要です。

[root@xxxxx policy]# ls
confined.te
[root@xxxxx policy]# make -f /usr/share/selinux/devel/Makefile
Compiling targeted confined module
/usr/bin/checkmodule: loading policy configuration from tmp/confined.tmp
/usr/bin/checkmodule: policy configuration loaded
/usr/bin/checkmodule: writing binary representation (version 6) to tmp/confined.mod
Creating targeted confined.pp policy package
rm tmp/confined.mod tmp/confined.mod.fc
[root@xxxxx policy]# ls
confined.fc confined.if confined.pp confined.te tmp/

confined.pp が生成されたポリシーモジュールです。

3) ポリシーモジュールをインストールします

[root@xxxxx policy]# semodule -i confined.pp
[root@xxxxx policy]# semodule -l | grep confined
confined 1.2
[root@xxxxx policy]#

4) /etc/selinux/targeted/contexts/users/user_u を作成し、以下の設定を加えます。

----------------
[root@xxxxx users]# cat /etc/selinux/targeted/contexts/users/user_u
system_r:unconfined_t:s0 system_r:confined_t:s0
system_r:local_login_t:s0 system_r:unconfined_t:s0
----------------

1行目の system_r:unconfined_t:s0 は、sshd経由でログインした場合の設定。
ここで、先ほどのポリシーで定義した confined_t を使っています。

2行目の system_r:local_login_t:s0 は、login経由でログインした場合の設定。
ここは、従来どおり unconfined_t を使います。

さて、この状態で sshd からログインしてみます。

----------------
[kaigai@xxxxx ~]$ ssh kaigai@xxxxx
kaigai@xxxxx's password:
Last login: Sat Jun 6 22:29:15 2009 from 192.168.1.100
[kaigai@xxxxx ~]$ id -Z
user_u:system_r:confined_t:s0
----------------

confined_t ドメインで動作していますね。

そして、shutdownコマンドを叩くべく su - を実行したところ
-----------------
[kaigai@xxxxx ~]$ su -
Password:
su: incorrect password
-----------------

パスワードが違うと言っていますが、実際のところは /var/log/audit/audit.log で
一目瞭然です。

-----------------
type=AVC msg=audit(1244296116.345:641): avc: denied { setuid } for pid=7104 comm="su" capability=7
scontext=user_u:system_r:confined_t:s0 tcontext=user_u:system_r:confined_t:s0 tclass=capability
-----------------

ユーザシェルから起動された su コマンド (confined_t) ドメインが、setuid の特権を
行使しようとしたが、それは許可されていないので SELinux は「だが断る!」として
su コマンドの実行を失敗させています。

もちろんローカルからのログインに対しては unconfined_t ドメインが適用されますので、
こういった事はありません。
上記の confined.te に記載してあるポリシーでは、/usr/bin 以下のコマンドを実行したり、
ホームディレクトリ上にあるファイルを読み書きする程度の権限しか与えていません。
必要に応じて、適宜権限を追加していくという感じになるでしょうか。

では。
--
KaiGai Kohei <kaigai@xxxxx>

_______________________________________________
Japan secure operating system users group
users-ml@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/jsosug-users


投稿者 xml-rpc : 2009年6月 6日 22:55
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/85666
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。