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


18

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

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


2
短い答え:chrootを使用します。
クリスダウン

@Chris Careが回答で詳しく説明しますか?マニッシュと私はこれに苦労しており、それを機能させることができないようです。
元に戻す

mysqlプログラムはどこにありますか?ユーザーは、それと、必要なすべてのライブラリとデータファイルを読み取れる必要があります。
ジル 'SO-悪であるのをやめる'

@Gillesうーん。私の知る限り、これはapt-getからの標準mysqlインストールです(私のシステムではなく、Undoのインストールです)。
マニッシュアース

回答:


18

ネガティブACL

アクセス制御リストを設定することにより、ユーザーがファイルシステムの特定の部分にアクセスするのを防ぐことができます。たとえば、ユーザーabcdが以下のファイルにアクセスできないようにするには/home

setfacl -m user:abcd:0 /home

このアプローチは簡単ですが、アクセスしたくないすべてのものへのアクセスをブロックすることを忘れないでabcdください。

クルート

表示できるものを確実に制御abcdするには、chrootをセットアップします。つまり、ユーザーをファイルシステムのサブツリーに制限します。

chrootの下で、ユーザーが必要とするすべてのファイル(mysqlおよびユーザーが実行できるようにする場合は、そのすべての依存関係)を作成する必要がありますmysql。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などのセキュリティフレームワークを使用することもできます。どちらの場合も、穴を残さないようにするために、かなり繊細な構成を作成する必要があります。


特定のディレクトリに読み取りおよび書き込み権限を付与するはるかに簡単な方法は、グループを作成することです。たとえば、新しいグループを作成し、chownを使用してディレクトリグループの所有者を作成したグループにし、ユーザーをグループに追加できます。最後に、ディレクトリの読み取りおよび書き込み権限をグループに付与します。
カシム

@Qasimこれには、すべてのファイルのパーミッションと所有権が必要に応じて設定されている必要があります。間違っている可能性のあるものはたくさんあります(他の場所からコピーされたファイルや、権限が保存されたアーカイブから抽出されたファイル、別のグループに属する必要があるファイル、グループが読み取り可能ではないファイル、ミスをしたユーザーグループのアクセシビリティが希望どおりに保たれるように気をつけてください…)グループは実際にこの問題を解決しません。
ジル「SO-悪であるのをやめ

ユーザーがディレクトリに「cd」またはディレクトリを「ls」できない方法でディレクトリのグループ権限が設定されている場合、ファイルに独自の権限が必要になる方法がわかりません。
カシム

@Qasim 自身/var/www/allowfolderだけでなく、その下のすべてのファイルとそのサブディレクトリにアクセスできる必要があります/var/www/allowfolder。逆に、他のファイルにアクセスできないようにする必要があります。実際、ファイルのアクセス許可とACLのみに基づいたソリューションでは、要件を完全に満たすことはできません。アクセス/var/wwwするにはxアクセス許可が必要なので、少なくともユーザーが特定の名前が存在するかどうかをテスト/var/wwwできます/var/www/allowfolder
ジル「SO-悪であるのをやめなさい」

わかりましたが、これから/ varディレクトリを除外し、/ home / userディレクトリ内の通常のディレクトリについて話しているとしましょうか?
カシム

5

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

これはその場で書かれました。私は現在、UNIXマシンの前にいるわけではありません。この例では、という名前のディレクトリがありますdir三つのファイルで:abc、とls。最初の3つは通常のファイルです。chrootにいる間にファイルをリストできるようlsに、実際のlsバイナリへのハードリンクです。

私はするつもりだchrootdir。(ルートディレクトリ内のいくつかのディレクトリを忘れていることに注意してください。)

シェル出力形式のセットアップを次に示します。

$ 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

しかし、これはすべてのシンボリックリンクでchroot環境全体をセットアップすることを必要としませんか?新しいユーザーが他のディレクトリにアクセスできないようにコマンドを実行する方が簡単ではありませんが、apacheのようなプログラムはそれらへのアクセスを失わないでしょうか?
マニッシュアース

基本的に、他のユーザーのアクセスに影響を与えずに、ユーザーに残りのfsへの読み取りアクセス権を失わせる方法はありますか(chmod経由)?
マニッシュアース

@Manishearthには簡単な方法はありませんchmod。「コマンドを実行する方が簡単ではないでしょう...それらへのアクセスを失わないでください」と言うとき、そのコマンドはchrootです。「chroot環境全体」が何を意味するのか、またはなぜこれが問題になるのかを説明していただければ、おそらくもっとよく理解できるでしょう。(ワンライナーですべての実行可能ファイルへのアクセスを許可できることに注意してください:ln /bin/* /path/to/chroot/target
strugee

@Manishearth私の例が意味をなさない場合は、自分で遊ぶか、意味をなさないchrootものを教えてください。さらに良いことに、両方を行います。(そしてマンページを読んでください。)
strugee

@Manishearthこの答えがあなたを答えに導くのに十分に役立ったなら、あなたはそれを受け入れることを考慮すべきです。
-strugee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.