web-dev-qa-db-ja.com

Linuxユーザーを自分が所有するファイルに制限する

複数(〜100)の顧客が単一のサーバーにシェルアクセスできる共有ウェブホスティング会社のサーバーセットアップを想像してください。

多くのウェブ「ソフトウェア」は chmodファイル0777 を推奨しています。私の顧客がこれらのチュートリアルを無理に実行し、他の顧客にファイルを公開することに不安を感じています。 (私は確かにcmod 0777不必要に私自身!)顧客が自分のファイルにしかアクセスできず、他のユーザーが誰でも読み取り可能なファイルにアクセスできないようにする方法はありますか?

私は AppArmor を調べましたが、それはプロセスと密接に結びついており、その環境では失敗するようです。

24
Phillipp

restrictedおよびimmutableディレクトリを外界と保護されたファイルの間に置きます、例えば.

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

または/home/joe/restricted/public_html

制限されているとは、ユーザーとおそらくWebサーバーだけがそれを読み取ることができることを意味します(例:モード0700/0750またはいくつかの ACLs )。

不変性は chattr +i で、または所有権をroot:joeのようなものに変更することで実行できます。

Ubuntuでその階層を作成する簡単な方法は、 /etc/adduser.conf を編集し、GROUPHOMESyesに設定することです。

34

検討する必要があるオプションがあります(そのために実行する作業量によって異なります)。

他の人がすでに投稿したように、「通常」、シェルがアクセスできるユーザーが誰でも読み取り可能なファイルを読み取ることを防ぐことはできません。

ただし、基本的にシェルへのアクセスを制限して、最初に必要なルートディレクトリ(別名ホームディレクトリ)に制限し、次に、ユーザーが実行したくないすべてのものをユーザーが実行できないようにします。

1人のユーザーがWebファイルにアクセスできるようにしたときも、同様の方法を使用しましたが、Webフォルダーの外部にある他のファイルを彼に見せたくありませんでした。

これにはかなりのオーバーヘッドがあり、設定が面倒で、何かを更新するたびに壊れました。

しかし、今日は OpenSSH chrootオプションでかなり簡単に実現できると思います。

WikiBooks OpenSSH

15
Dennis Nolte

たとえば、ユーザーが自分のhomeディレクトリにのみアクセスできるようにする場合は、次のようにします。

cd /home
Sudo chmod 700 *

/home/usernameはその所有者にのみ表示されます。これをすべての新規ユーザーのデフォルトにするには、 /etc/adduser.conf と設定DIR_MODEから0700の代わりに0755 デフォルト。

もちろん、あなたのディストリビューションに依存するデフォルトのDIR_MODEを変更したい場合、私が投稿したものはUbuntuで動作します。

編集する

@ Dani_l が正しく言及されているように、この解答は、誰もが読めるようにするには正しくありません。

3
Marek

Linuxコンテナ(LXC) は、chrootと個別のシステムの最良の組み合わせになる可能性があります。

  1. これらは仮想化ではなく、高度なchrootに似ていますが、1つのサーバーで異なるオペレーティングシステムを組み合わせることができます。

  2. ユーザーに完全なオペレーティングシステムを提供し、そこにchrootできるので、ユーザーがログインすると、コンテナーに移動します。また、プロセッサとメモリの使用量を制限することもできます。

LXCの作者であるStéphaneGraberには、始めるのに役立つ素敵な tutorial があります。

3
maniaque

知識を深めるためだけに-いいえ、ありません。
@ Marekは正しい answer を出しましたが、あなたの質問は正しくありません-「誰でも読み取り可能な」ファイルへのアクセスをだれも防ぐことはできません。
それらは世界中で読めるか、読めないかのどちらかです。 @Marekの答えは、それらを誰もが読めるようにすることではありません。

2
Dani_l

これまでの回答では、「制限付きシェル」についての言及はありません。

ln/bin/bash/bin/rbash

これをログインシェルとして設定します。

0
bbaassssiiee

ホストされているすべてのドメインでWebサーバーが同じユーザーおよびグループとして実行されている場合、セットアップを安全にすることは(不可能ではないにしても)困難です。

特定のファイルにユーザーとWebサーバーはアクセスできるが、他のユーザーはアクセスできないようにする必要があります。しかし、Webサーバーがそれらにアクセスできるとすぐに、別のユーザーが自分のWebサイト内のファイルへのシンボリックリンクを配置することによって、それらを読み取ることができます。

各Webサイトを個別のユーザーとして実行できるようになれば、かなり簡単になります。これで、各顧客のシステムに2人のユーザーがいます。1人はWebサーバー用で、もう1人はシェルアクセス用です。

これら2人のユーザーを含むグループを作成します。次に、そのグループとユーザーrootでディレクトリを作成します。そのディレクトリにはパーミッション750が必要です。つまり、rootには完全なアクセス権があり、グループには読み取りと実行のアクセス権があります。そのディレクトリ内に、2人のユーザーそれぞれのホームディレクトリを作成できます。つまり、ユーザーのホームディレクトリは/home/usernameという形式ではなく、ディレクトリコンポーネントが少なくとも1つ追加されたものになります。これは問題ではありません。ホームディレクトリに特定の規則に従って名前を付ける必要はありません。

名前ベースの仮想ホストを使用している場合、異なるユーザーとグループでWebサイトを実行するのは難しいかもしれません。 IPベースの仮想ホストでのみ分離を機能させることができ、各サイトに十分なIPがない場合は、各WebサイトをIPv6アドレスでホストし、それらすべてのリバースプロキシをIPv4アドレス。

0
kasperd