【Linux】 findコマンドとパーミッション

Linux

findコマンドでSUIDとSGIDが関連するファイルを検索する

Lpic102を受けようと問題を解いていると、findコマンドを使用した問題がちょいちょい現れます。よく出てくるので、実際に検証してみました。

特に、「SUIDとSGIDのいずれか片方でも設定されているファイルを検索できるのはどれか」と問題に対する答えが参考書によって違う!ということがあったので、この度実際に調べてみました。

本記事を読んでいただければわかりますが、一応2パターンあるのは事実で、片方は形式が古いというオチです(厳密にいうと古い方は答えとしては不適です)。

コマンドの論点

findコマンドで「-perm」オプションを使用する話です。具体的には、SUIDとSGIDが設定されているファイルを検索したいと言う話が過去問の大筋です。

問われるのは、「SUIDとSGIDが両方とも設定されているファイルを調べるコマンドはどれか」「SUIDまたはSGIDが設定されているファイルを調べるコマンドはどれか」と言う形式で問われることが多いです。

コマンドの形式を具体的に見る

検証したいコマンドは以下です。※初見だと何が違うのかわかりにくいですよね。

① find /usr -perm -6000

② find /usr -perm /6000

③ find /usr -perm +6000

コマンドの意味

①はSUIDとSGIDが両方設定されているファイルを、/usrディレクトリ以下を検索します。

②はSUIDとSGIDのいずれか片方でも設定されているファイルを検索します。

③もSUIDとSGIDのいずれか片方でも設定されているファイルを検索します。※下記の検証を要確認!

検証

何はともあれ、実際に検証してみます。

検証1 SUIDとSGIDを両方含んでいるファイルを検索

「find /usr -perm -6000 |xargs ls -l」を実行してみます。「xargs ls -l」はfindコマンドで取得したファイル名の詳細情報を取得したいために実行しています。

~ # find /usr -perm -6000 |xargs ls -l
-rwsr-sr-x. 1 abrt abrt 15344 10月  2 01:28 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

SUIDとSGIDを両方含んでいるファイルを検索することができます。

検証2 SUIDとSGIDをどちらか一方を含んでいるファイルを検索

「find /usr -perm +6000 |xargs ls -l」を実行してみます。

~ # find /usr -perm +6000 |xargs ls -l
find: warning: you are using -perm +MODE'.  The interpretation of -perm +omode' changed in findutils-4.5.11.  The syntax -perm +omode' was removed in findutils-4.5.12, in favour of -perm /omode'.

怒られますね。もう「+」で指定するのは古いんだそうです。
※怒られるだけで結果を表示してくれるわけではないんですね。そうなるとこれって答えとしては不適になってしまうわけですが…細かいことは割愛。

改めて「/」を先頭につけて検索します。「find /usr -perm /6000 |xargs ls -l」を実行します。

~ # find /usr -perm /6000 |xargs ls -l
-rwsr-xr-x. 1 root root     2447304  4月  1  2020 /usr/bin/Xorg
-rwsr-xr-x. 1 root root       53048 10月 31  2018 /usr/bin/at
-rwsr-xr-x. 1 root root       73888  8月  9  2019 /usr/bin/chage
-rws--x--x. 1 root root       23968 10月  1 02:46 /usr/bin/chfn
-rws--x--x. 1 root root       23880 10月  1 02:46 /usr/bin/chsh
-rwsr-xr-x. 1 root root       57656  8月  9  2019 /usr/bin/crontab
-rwsr-xr-x. 1 root root       32096 10月 31  2018 /usr/bin/fusermount
-rwsr-xr-x. 1 root root       78408  8月  9  2019 /usr/bin/gpasswd
(途中省略)
-rwsr-xr-x. 1 root root       15448  4月  1  2020 /usr/libexec/spice-gtk-x86_64/spice-client-glib-usb-acl-helper
-rwx--s--x. 1 root utmp       11192  6月 10  2014 /usr/libexec/utempter/utempter
-rwx--s--x. 1 root lock       11208  6月 10  2014 /usr/sbin/lockdev

SUIDかSGIDのどちらか一方でも含まれている場合、検索の対象になっています。

検証3 SUIDを含んでいるファイルを検索

「find /usr -perm -4000 |xargs ls -l」を実行することで、SUIDのみ(SGIDなし)設定されているファイルだけを取得できます。

~ # find /usr -perm -4000 |xargs ls -l
-rwsr-xr-x. 1 root root    2447304  4月  1  2020 /usr/bin/Xorg
-rwsr-xr-x. 1 root root      53048 10月 31  2018 /usr/bin/at
-rwsr-xr-x. 1 root root      73888  8月  9  2019 /usr/bin/chage
(途中省略)

全部表示するとちょっと多すぎるので、途中は一部だけ掲載しています。

検証4 SGIDを含んでいるファイルを検索

「find /usr -perm -2000 |xargs ls -l」を実行することで、SGIDのみ(SUIDなし)設定されているファイルだけを取得できます。

~ # find /usr -perm -2000 |xargs ls -l
-rwx--s--x. 1 root slocate   40520  4月 11  2018 /usr/bin/locate
---x--s--x. 1 root nobody   382216  8月  9  2019 /usr/bin/ssh-agent
-r-xr-sr-x. 1 root tty       15344  6月 10  2014 /usr/bin/wall
-rwxr-sr-x. 1 root tty       19544 10月  1 02:46 /usr/bin/write
(途中省略)

全部表示するとちょっと多すぎるので、こちらも途中は一部だけ掲載しています。

検証5 包含関係が適切かを検証

本当に指定した通りに検索ができているのかは、上記結果だけではわかりません。
結果に対して「wc -l」をパイプで実行することでコマンドの出力行数が取得できるので、それぞれの出力行数を確認してみます。

~ # find /usr -perm /6000 |wc -l
38
~ # find /usr -perm -4000 |wc -l
27
~ # find /usr -perm -2000 |wc -l
12
~ # find /usr -perm -6000 |wc -l
1

集合で言う「n(A∪B) = n(A) + n(B) – n(A∩B)」が確かに成立しています。

よくわからない人は、「集合 個数」などで検索してみてください。集合の基礎なら数学Ⅰ、数学Aの教科書に載ってますので、その辺りも参考にしてみてください。