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


24

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

多くのWeb "ソフトウェア"は、ファイル0777chmodすることを推奨しています。私たちの顧客がこれらのチュートリアルに従わずに他の顧客にファイルを公開することに不安を感じています。(私は確かにcmod 0777自分で不必要に使用していません!)顧客が自分のファイルにしかアクセスできないようにし、他のユーザーからの読み取り可能なファイルにアクセスできないようにする方法はありますか?

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


12
「ウェブソフトウェア」の推奨事項chmod files 0777が厳密に必要かどうか、つまり、だれでも他の人のファイルを読むことができるという症状ではなく、問題の根本原因に対処するかどうかを実際に検討します。多くの場合、すべてのアクセスを許可するという推奨事項は、サポートコールを回避するための安価な方法、またはアクセス許可を正しく設定できる技術的な能力の欠如にすぎません。0777要求されたときにファイルを設定したり、アプリケーションに完全なルートアクセスを許可したりする必要はほとんどありませんでした。ユーザーやベンダーの教育は、ここで大いに役立ちます。
宇宙のオシフラジ14

3
@CosmicOssifrage、ユーザーは簡単に教育を受けることができず、指示やマニュアルを読みたくないのです。
クリスティアンシウピトゥ14

12
まだ777の許可を推奨している「Webソフトウェア」はすべて取り出して撃つ必要があります。suexecまたはを使用してくださいmpm_itk
シャドゥール14

3
@CosmicOssifrage Phillippがユーザーにchmod 0777自分のファイルを伝えたり強制したりするとは思わない。よく書かれていない記事を盲目的に追っている間、彼は彼らが自分たちで行ってloltoturialz.com/php_problems設定することに神経質だと思うchmod 0777。彼らがそうするのを防ぐ方法、または誰かが物を盗んだときに動揺するのを防ぐ方法は本当にありません。
ケビン-モニカの復活14

2
@kevin-保証の無効が作成された理由です。このような条項のない深刻なアプライアンス(ソフトウェアのコンパイル、多数のスクリプトなど)はほとんど見たことがありません。そして、それを信じるかどうか-ユーザーはこれをよく知っている最もcorpprate環境で
Dani_l

回答:


34

制限された不変のディレクトリを外の世界と保護されたファイルの間に置きます。例えば

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

または/home/joe/restricted/public_html

唯一のユーザーと、おそらくWebサーバはそれを読むことができる手段を制限付き(例えばモード0700/ 0750またはいくつかのACL)。

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

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


15

検討したいオプションがあります(そのためにどの程度の作業を行いたいかによって異なります)。

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

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

1人のユーザーにWebファイルへのアクセス権を持たせたときと同じようなアプローチをとりましたが、Webフォルダーの外部にある他のファイルを見るようにしたくありませんでした。

これには多くのオーバーヘッドがあり、セットアップが面倒で、何かを更新するたびに壊れていました。

しかし、今日は、OpenSSHの chrootオプションを使用すると、非常に簡単に実現できると思います。

WikiBooks OpenSSH


SFTPのchrootは簡単に実装できますが、シェルアクセスがそれほど簡単かどうかはわかりません。各ユーザーのすべてのバイナリとライブラリでchrootをセットアップする必要があります。
クリスチャンシウピトゥ14

2
それは実装固有です。ARCHLINUXは、すべての余分なバインドマウントなどの世話取る具体的なアーチ-chrootコマンドがあるwiki.archlinux.org/index.php/Change_Root#Change_root
Dani_l

@CristianCiupitu私がやったこと、すべてのネッセサリーライブラリをリンクするコマンドの特定のサブセットのみを許可すること、それが混乱だと言った理由です:) 。
デニスノルテ14

@Dani_l:インストールされたパッケージはどうですか?arch-chrootコマンドはそれをカバーしていないようです。そして、すべての重複で無駄なディスクスペースの問題もあります。私はそれをすることは不可能だと言っているのではなく、ただそれが現在少し複雑かもしれないというだけです。
クリスティアン・Ciupitu 14

1
これをもっと簡単にするには、UnionFSを使用して、ユーザーを読み取り専用モードと読み取り/書き込みホームディレクトリのrootfsの特別なユニオンにchrootします。つまり、すべてのシステムパッケージとバイナリが表示されますが、書き込みは自動的に行われますホームフォルダー。これは、ユーザーが他のユーザーからファイルを読み取ることができるように、すべてのホームディレクトリに700のアクセス許可を設定する必要があります。
バリティ14

11

POSIXアクセスコントロールリストを使用すると、システム管理者として、通常のユーザーグループとその他のファイルシステムのアクセス許可をオーバーライドすることにより、重大なことをほとんど中断することなく、ユーザーを最悪の無知から保護できます。 。

たとえば、WebコンテンツはでApacheにアクセスできる必要があるため、たとえば(fi)ホームディレクトリを世界中からアクセスできるようにする必要がある場合に特に役立ちます~/public_html/。(ACLを使用すると、逆の操作を行うことができますが、すべてのアクセスを削除し、Apacheユーザーに対して特定の有効なACLを使用します。)

はい、知識のあるユーザーは再びそれらを削除/上書きできますが、それはありそうもないほど一般的ではありませんchmod -R 777 ~/

aclマウントオプションでファイルシステムをマウントする必要があります:

 mount -o remount,acl /home

多くのディストリビューションでは、デフォルトではユーザーグループが作成され、各ユーザーにはプライマリグループがあります。すべてのユーザーを想像できない名前のセカンダリグループに設定しましたusers

ACLを使用すると、他のユーザーがホームディレクトリにアクセスできないようにするのは簡単です。

前:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

次に、usersグループのメンバーの有効なディレクトリアクセス許可を0読み取り、書き込み、またはアクセスなしに設定します。

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

+看板がACLの設定の存在を示しています。そして、次のgetfaclことを確認できます。

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

group:users:---グループは、効果的に他のビーイングのための定期的なアクセス許可にもかかわらず、何のアクセス権を持たないことを示しother::rwx

そしてuser1としてテストします:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

共有システムでの2番目の一般的な解決策は、オートマウンタがホームディレクトリを必要に応じてマウントし、シェルアクセス専用のサーバーを使用することです。これは決して簡単なことではありませんが、通常、同時にログインするのは少数のユーザーのみです。つまり、それらのユーザーのホームディレクトリのみが表示され、アクセス可能です。


5
「fi」とは何ですか?「eg」、「ie」、「etc」、おそらくOPのような古典的なものでない限り、頭字語や略語の使用はお勧めしません。
クリスティアン・Ciupitu

3

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

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

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

LXCの作者であるStéphaneGraberが、あなたが始めるのに役立つ素晴らしいチュートリアルを持っています。


それらのすべてが使用する必要があるので、あなたは本当に、異なるオペレーティングシステムを組み合わせることはできませんLinuxカーネルをしますが、さまざまな使用することができ分布を
クリスティアン・Ciupitu

1
ありがとう:)はい、異なるLinuxカーネルベースのオペレーティングシステム。
マニアック

@CristianCiupitu同一のLinuxカーネルを意味しますか?または、各コンテナが異なるバージョンのカーネルを持つことができるということですか?
agks mehx 14

@agksmehx、すべてのLXCコンテナーはホストのカーネルを共有します。それらのアプリケーションとライブラリのみが使用されます。たとえば、Ubuntu 14.04コンテナを備えたRHEL 7ホストがある場合、RHELカーネル(3.10.0-123)が使用され、Ubuntuカーネル(3.13.0-24.46)は使用されません。チュートリアルのこのコメントもお読みください。ちなみに、コンテナのカーネルは使用されないため、ディスク容量を節約するためにそれらを削除することをお勧めします。
クリスティアン・Ciupitu 14

@CristianCiupituそれは私が思ったことです。答えやコメントから明らかではなかったので、明確にしたかった。
agks mehx 14

3

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

cd /home
sudo chmod 700 *

現在/home/usernameは所有者のみに表示されます。これをすべての新規ユーザーのデフォルトにするには、編集/etc/adduser.confして設定DIR_MODEします07000755デフォルトにには、デフォルトの代わりにます。

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

編集する

以下のよう@Dani_lが正しく述べたように、この答えは、世界読めるそれらをしないで作るのが正しいです。


それらは、理由により「世界で読める」と呼ばれています。
マークKコーワン14

1
@DennisNolte実際、ファイルが誰でも読み取り可能であっても、読み取りまたは実行のいずれもしていないディレクトリにある場合は、いずれにしても読み取ることができません。
バリティ14

1
@Vality true、明らかに間違っているのでコメントを削除します。
デニスノルテ14

2

ただつまんないように-いいえ、ありません。
@Marekは正しい答えを出しましたが、あなたの質問は間違っています-「誰でも読める」ファイルに誰もアクセスできないようにすることはできません。
誰でも読めるか、そうでないかのどちらかです。@Marekの答えは、それらを世界中で読めないようにするという点で正しいです。


2
間違って、ユーザーをサブフォルダーにchroot / jailすると、「通常」世界で読み取り可能なファイルを読み取ることができません。
デニスノルテ14

1
-1あなたはOPの質問に対して不必要に批判的だと思う。彼は、顧客が許可について賢くない場合に備えて、顧客にセーフティネットを提供したいと考えています。しかし、私には、OPがUnixファイルのアクセス許可のしくみや基本的なセキュリティプリンシパルを認識していないようには見えません。
ケビン-モニカの復活14

また、ファイルを000アクセス許可ディレクトリ内のディレクトリに配置すると、ファイルが誰でも読み取り可能であっても、誰もアクセスできません。
バリティ14

誰も?ルートでさえない?;-)
Dani_l 14

@Kevinは、私のコメントが不必要に密接に批判されていることに同意しました。しかし、Dani_Iは、彼が物足りないことや、ハチが間違っていることを気にしてはなりません。私は彼の答えの残りに同意しないと述べていない。
デニスノルテ

0

私はこれまでに与えられた答えの中で「制限されたシェル」について言及していない。

ln / bin / bash / bin / rbash

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


0

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

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

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

これら2人のユーザーを含むグループを作成します。次に、そのグループとユーザーrootでディレクトリを作成します。そのディレクトリには権限が必要です。つまり750、ルートにはフルアクセス権があり、グループには読み取りおよび実行アクセス権があります。そのディレクトリ内で、2人のユーザーそれぞれにホームディレクトリを作成できます。これは、ユーザーのホームディレクトリがの形式/home/usernameではなく、少なくとも1つ以上のディレクトリコンポーネントを持つフォームを持つことを意味します。これは問題ではありません。特定の規則に従ってホームディレクトリに名前を付ける必要はありません。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.