ユーザーに1つのディレクトリにのみ読み取り/書き込みアクセス権を付与します。

ユーザーに1つのディレクトリにのみ読み取り/書き込みアクセス権を付与します。

私はサーバーを実行しており、単一のユーザーに特定のディレクトリへの読み取り/書き込みアクセス権を付与する必要があります。私は以下を試しました:

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

すべての子プロセスが表示するルートディレクトリを変更するには。コマンドを使用する必要がありますchrootchrootこれがどのように機能するかを示すために例を挙げましょう。

私はこの記事をその場で書きました。実際、今はUNIXシステムの前に立っているわけではありません。この例には、3つのファイルをdir含むディレクトリがありますa。最初の3つは一般的なファイルです。 chrootにファイルを一覧表示できるように、実際のバイナリへのハードリンク。bclslsls

(ルートディレクトリの一部のディレクトリを忘れた可能性があります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

関連情報