私はサーバーを実行しており、単一のユーザーに特定のディレクトリへの読み取り/書き込みアクセス権を付与する必要があります。私は以下を試しました:
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
。
答え1
否定的なACL
設定により、ユーザーがファイルシステムの特定の部分にアクセスするのを防ぎます。アクセス制御リスト。たとえば、ユーザーがabcd
次のファイルにアクセスできないことを確認します/home
。
setfacl -m user:abcd:0 /home
この方法は単純ですが、abcd
アクセスしたくないアイテムへのアクセスをブロックする必要があることに注意してください。
クロット
abcd
表示できる内容を積極的に制御するには、次の設定を行います。chrootつまり、ユーザーをファイルシステムのサブツリーに制限します。
mysql
ユーザーに必要なすべてのファイル(たとえば、ユーザーが実行できるようにする場合は、そのファイルのすべての依存関係mysql
)をchrootの下に配置する必要があります。 chrootへのパスがあると仮定すると、/home/restricted/abcd
プログラムmysql
はで利用可能でなければなりません/home/restricted/abcd
。 chroot の外側を指すシンボリックリンクは、シンボリックリンクのルックアップが chroot Jail の影響を受けるため、悪いことです。 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などのセキュリティフレームワークを使用することもできます。どちらの場合も、穴が残らないようにかなり細かい構成を作成する必要があります。
答え2
すべての子プロセスが表示するルートディレクトリを変更するには。コマンドを使用する必要がありますchroot
。chroot
これがどのように機能するかを示すために例を挙げましょう。
私はこの記事をその場で書きました。実際、今はUNIXシステムの前に立っているわけではありません。この例には、3つのファイルをdir
含むディレクトリがありますa
。最初の3つは一般的なファイルです。 chrootにファイルを一覧表示できるように、実際のバイナリへのハードリンク。b
c
ls
ls
ls
(ルートディレクトリの一部のディレクトリを忘れた可能性があります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
ファイルに他の方法でアクセスできない場合でもファイル内で動作し続けます(ハードリンクがパスではなくinodeを指しているため機能します)。したがって、ユーザーがmysql
コマンドにアクセスできるようにするには、次の手順を実行します。
ln /usr/bin/mysql /path/to/chroot/target