サーバーを実行していて、特定のディレクトリへの読み取り/書き込みアクセス権を単一のユーザーに与える必要があります。私は以下を試しました:
Sudo adduser abcd
Sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd
上記は機能しているように見えますが、サーバーの他の部分への読み取り専用アクセスをユーザーに与えます。
ユーザーが特定のフォルダのみを読み書きできるようにアクセス許可を設定するにはどうすればよいですか?また、ユーザーはmysql
のようなプログラムを実行できる必要があります。
アクセス制御リスト を設定することで、ユーザーがファイルシステムの特定の部分にアクセスできないようにすることができます。たとえば、ユーザーabcd
が/home
の下のファイルにアクセスできないようにするには:
setfacl -m user:abcd:0 /home
このアプローチは簡単ですが、abcd
にアクセスさせたくないものすべてへのアクセスをブロックすることを忘れないでください。
abcd
が表示できるものを確実に制御するには、 chroot を設定します。つまり、ユーザーをファイルシステムのサブツリーに制限します。
ユーザーが必要とするすべてのファイル(たとえば、mysql
とそのすべての依存関係、ユーザーがmysql
を実行できるようにする場合)をchrootの下に作成する必要があります。 chrootへのパスが/home/restricted/abcd
だとします。 mysql
プログラムは/home/restricted/abcd
で使用できる必要があります。シンボリックリンクのルックアップはchroot jailの影響を受けるため、chrootの外部を指すシンボリックリンクは適切ではありません。 Linuxでは、バインドマウントをうまく利用できます。
mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr
ファイルをコピーすることもできます(ただし、ファイルが最新であることを確認する必要があります)。
ユーザーをchrootに制限するには、ChrootDirectory
ディレクティブを /etc/sshd_config
に追加します。
Match User abcd
ChrootDirectory /home/restricted/abcd
次のコードでテストできます:chroot --userspec=abcd /home/restricted/abcd/ /bin/bash
SELinuxやAppArmorなどのセキュリティフレームワークを使用することもできます。どちらの場合も、穴を残さないようにするために、かなりデリケートな構成を作成する必要があります。
chroot
を使用する必要があります。 chroot
コマンドは、すべての子プロセスが見るルートディレクトリを変更します。それがどのように機能するかを示すために例を挙げます。
これはその場で書かれました。現在、私は実際にはUNIXマシンの前にはいません。この例では、dir
という名前のディレクトリがあり、a
、b
、c
、ls
の3つのファイルがあります。最初の3つは通常のファイルです。 ls
は、実際のls
バイナリへのハードリンクであるため、chrootでファイルを一覧表示できます。
chroot
をdir
に入れます。 (ルートディレクトリ内のいくつかのディレクトリを忘れていることに注意してください。)
シェルの出力形式での設定は次のとおりです。
$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var
次に、chroot
をdir
に入れます。 /bin/bash
引数は、新しいルートディレクトリで実行するプロセスを選択します。デフォルトは/bin/sh
。
$ chroot /bin/bash dir
$ # this Prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/
ここで、chroot
を終了します。
$ exit
$ # this Prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
これがchroot
コマンドの動作を説明しているといいのですが。基本的に、問題を解決するために必要なことは、ログインするたびにそのユーザーとしてchroot
コマンドを実行することです。たぶん、起動スクリプトに入れますか?
他の方法でファイルにアクセスできない場合でも、ファイルへのハードリンクはchroot
内で機能し続けます(これは、ハードリンクがパスではなくiノードを指すため機能します)。したがって、ユーザーがアクセスできるようにするには、 mysql
コマンドでは、次のコマンドを実行します。
ln /usr/bin/mysql /path/to/chroot/target