通常、ルートのみアクセスできます/etc/shadow
。ただしsu
、同じプログラムは、sudo
rootとして実行しなくてもパスワードを確認できます。したがって、質問は:なぜこれらのプログラムに/etc/shadow
許可なくアクセスできるのですか?私はモジュールを使ってPythonを介して許可なくアクセスしようとしましたがspwd
(予想どおり)アクセスできませんでした。このプログラムはどのようなメカニズムを使用しますか?
答え1
suのようなプログラムが/etc/shadowにアクセスできるのはなぜですか?
プログラムイメージsu
とpasswd
すでに設定されているためですSetUID
。以下を使用して確認できます。
[root@tpserver tmp]# ls -l /usr/bin/passwd
-r-s--x--x 1 root root 21200 Aug 22 2013 /usr/bin/passwd
ファイル権限を見ると「s」が表示されます。誰かがプログラムを実行しようとすると、デフォルトではpasswd
ファイル所有者(ここではroot)の権限が必要です。これは、rootユーザーだけがファイルをpasswd
編集または更新できるため、すべてのユーザーがプログラムを実行するためのroot権限を取得できることを意味します。他のユーザーはできません。通常のユーザーが端末でこのプログラムを実行すると、有効なUIDは「root」に設定されているため、プログラムは「root」として実行されます。したがって、一般ユーザーは簡単にファイルを更新できます。/etc/passwd
/etc/shadow
passwd
passwd
または、パラメータchmod
と一緒にコマンドを使用して、それぞれ実行可能ファイルにsetuidビットとsetgidビットを設定できます。u+s
g+s
長い答え:Set-User_Id(SUID):一時的に電源を入れる:
デフォルトでは、ユーザーがファイルを実行するときにファイルを実行するプロセスは、ユーザーと同じ権限を持ちます。実際、プロセスは彼の基本グループとユーザーIDを継承します。
実行可能ファイルにSUID属性を設定すると、そのファイルを実行したプロセスはユーザーのIDを使用せず、ファイル所有者のユーザーIDを使用します。
Dennis Ritchieが発明したSUIDメカニズムには潜在的なセキュリティリスクがあります。これにより、ユーザーはrootが所有するファイルを実行して隠し権限を取得できます。
$ ls -l /etc/passwd /etc/shadow /usr/bin/passwd
-rw-r--r-- 1 root root 2232 Mar 15 00:26 /etc/passwd
-r-------- 1 root root 1447 Mar 19 19:01 /etc/shadow
リストには、passwd は誰でも読むことができますが、Shadow はグループや他の人が読めないことを示します。プログラムを実行しているユーザーがこれら2つのカテゴリのうちの1つ(別のカテゴリである可能性があります)に属すると、シャドウの読み取りテストでアクセスが失敗します。一般ユーザーが自分のパスワードを変更しようとしているとします。彼はどのようにこのようなことができましたか?彼は以下を実行してこれを行うことができます/usr/bin/passwd
。多くのUNIX / Linuxプログラムには、ユーザーが機密性の高いシステムファイル、つまり/etc/shadow
エディタを使用して直接実行できないタスクを更新できる特別な特権モードがあります。プログラムも同じですpasswd
。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 22984 Jan 6 2007 /usr/bin/passwd
権限フィールドのユーザーカテゴリの文字sは、ユーザーID設定(SUID)と呼ばれる特別なパターンを表します。このモードは、プログラムインスタンス期間中にプロセスにファイル所有者の権限を付与します。したがって、権限のないユーザーがpasswdを実行すると、プロセスの有効なUIDはそのユーザーのUIDではなく、ルート(プログラム所有者)のUIDになります。その後、passwdはこのSUID権限を使用して/etc/shadow
。