web-dev-qa-db-ja.com

グローバルに書き込み可能なファイルとユーザーベースのプロセスジェイル

特定の実行可能ファイル(悪意のある可能性がある)xを一般的に選択し、特定のディレクトリに制限された書き込みアクセス(動的に推定)で(管理者アカウントから)実行できるようにしたい"${dirs[@]}"

実行可能ファイルは、システム上でグローバルにアクセス可能なものすべてにアクセスできる必要があります。

これらの実行可能ファイルを実行するために、単純なユーザー切り替えを使用して、専用のステートレスシステムユーザーforeveraloneを使用できると考えました。

これらの制限付きでxを実行したいときはいつでも、flockロックファイルchown -R foreveralone:foreveralone -- "${dirs[@]}"そしてSudo -u foreveralone -g foreveralone $PWD/x

その後、他の誰かにディレクトリをchown書き込むので、foreveraloneはファイルシステム上に永続ファイルを持ちません。グローバル書き込みディレクトリもクリーンアップする必要があると思います(例:/tmp, /dev/shmforeveralonesファイルから。

私の質問は次のとおりです。

  1. 標準的にセットアップされた* nixシステムを考えると、これはジェイルプロセスのための実行可能で安全なメカニズムですか?
  2. 標準設定の* nixで、グローバルに書き込み可能な標準の場所とファイルは正確には何ですか?
  3. どうすれば次のようなものよりもうまくそれらを見つけることができますか

    Sudo -u foreveralone -g foreveralone find /! -type l -writable 2>/dev/null | grep -v '^/proc'

    (私のfindゲームは非常に弱いです。/proc/$pid書き込み可能に見えるファイルがたくさんあるように見えますが、実際にはそうではないので、それらをスキップします(どうしたのだろうか))。

とにかく、私のシステムでは、3。戻り値(ファイルタイプを表示するためにフィルタリングされます):

  character special file    /dev/full
  character special file    /dev/Fuse
  character special file    /dev/net/tun
  character special file    /dev/null
  character special file    /dev/ptmx
  character special file    /dev/random
  character special file    /dev/tty
  character special file    /dev/urandom
  character special file    /dev/zero
  character special file    /sys/kernel/security/apparmor/.null
  directory /run/lock
  directory /run/shm
  directory /tmp
  directory /tmp/.ICE-unix
  directory /tmp/.X11-unix
  directory /var/local/dumps
  directory /var/mail
  directory /var/spool/samba
  directory /var/tmp
  regular empty file    /run/sendmail/mta/smsocket
  regular empty file    /sys/kernel/security/apparmor/.access
  socket    /dev/log
  socket    /run/acpid.socket
  socket    /run/avahi-daemon/socket
  socket    /run/cups/cups.sock
  socket    /run/dbus/system_bus_socket
  socket    /run/gdm_socket
  socket    /run/mysqld/mysqld.sock
  socket    /run/samba/nmbd/unexpected
  socket    /run/sdp
  socket    /tmp/.ICE-unix/2537
  socket    /tmp/mongodb-27017.sock
  socket    /tmp/.X11-unix/X0
  1. より良い(これに対するより単純でより柔軟な解決策)はありますか

私の特定のケースでは、xは潜在的に悪意のあるビルドスクリプトであり、間違った場所に書き込んだり、グローバルに読み取れないものを読み取ったりすることなく実行する必要があります。

1
PSkocik

私の悪い英語を最初に申し訳ありません。 UNIXの概念のみを使用して何かを示しましょう。それが役立つ(または役に立たない)と思うからです。

実行可能ファイルnanoをすべてのユーザーが実行できるようにしたいが、実行可能ファイルを呼び出すユーザーとして実行してはならないが、環境が制限されており、Apache構成のみまたは特定のグループのファイルを編集するためのアクセス権があると想像してください。特定の仮想ユーザー権限に制限されたLinuxサービスのようにnanoを実行したい。

1-最初にユーザーnanoを作成し、ログインを無効にします。

useradd nano -d /var/nano
mkdir /var/nano 
chown -R nano:nano /var/nano
passwd -l nano

2-nanoをユーザーnanoとして実行するように強制します(たとえば、ルートがnanoを呼び出す場合、ルートではなくnanoとして実行する必要があります)

chown nano:nano /usr/bin/nano
chmod a+s /usr/bin/nano

+ sは、nanoが所有者として実行され、誰が呼び出したのかではないことを意味します。

3-テストのためにrootでnanoを呼び出します:

#nano
#ps aux | grep nano
nano      3399  0.0  0.0  13828  3840 pts/0    S+   08:48   0:00 nano

綺麗な! Nanoは、ログインしたユーザーに依存せずに、ユーザーnanoとして実行されるようになりました。

4-それで今何? nanoに/ var/www/Apache2のファイルを編集してもらいたい

chgrp -R www-data /var/www/ (yes i now that is unnecessary in Debian if the group are respected)
chmod -R g+rw /var/www 
adduser nano www-data

5-さらに何?

すべてのユーザーがnano(またはその特別なコピー「nano-special」;-)を使用して/ var/wwwファイルを編集できるようになったことに気付くでしょう。グループnanoのユーザーだけがそれを実行できるようにするにはどうすればよいでしょうか?

他の権限を削除して実行するだけです。

chmod o-x /usr/bin/nano 

そして、ユーザーをグループnanoに追加します

adduser myuser1 nano