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コマンドで取得したファイル名の詳細情報を取得したいために実行しています。
1 2 |
~ # 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」を実行してみます。
1 2 |
~ # 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」を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
~ # 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なし)設定されているファイルだけを取得できます。
1 2 3 4 5 |
~ # 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なし)設定されているファイルだけを取得できます。
1 2 3 4 5 6 |
~ # 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」をパイプで実行することでコマンドの出力行数が取得できるので、それぞれの出力行数を確認してみます。
1 2 3 4 5 6 7 8 |
~ # 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の教科書に載ってますので、その辺りも参考にしてみてください。