ルート権限を拒否できるユーザーを実際に持つことができるように、スーパーユーザーを作成することはできますか?


34

ルートユーザーよりも高いアクセス許可を持つユーザーがいると有利だと考えていました。

ご覧のとおり、すべてのアクティビティと既存のほぼすべてのルートユーザー権限を現在の状態のままにしておきたいと思います。

ただし、非常に孤立したケースごとに、rootへの特権を拒否する機能が必要です。

この利点の1つは、更新中に特定の不要なファイルがインストールされるのを防ぐことです。これは、考えられる利点の一例です。

apt-getの更新はrootまたはsudo特権で実行されるため、apt-getには更新中に特定の不要なファイルを置き換える機能があります。

これらの個々の特定のファイルに対するこれらの特権を拒否できる場合は/dev/null、更新中にファイルの置き換えを拒否するアクセス許可を持つ可能性のある空白のプレースホルダーファイルへのsimlinkとして設定できます。

さらに、Ubuntuクリエイターの1人とのインタビューで、ユーザーが「私たち」(Ubuntu開発者を参照)をよりよく信頼する方法について彼が言ったときに言われた行について思い出せずにはいられませんこれは、システムの更新がルート権限で実行される方法への参照でした。

この問題を回避するためにインストール手順を変更するだけでは、私がここで興味を持っていることは絶対にありません。私の心はルートアクセスを拒否する力を持っているという考えを持っているので、それを行うためだけにこれを実現する方法を見つけたいと思います。

私はこれについて考えただけで、これまでこのアイデアに時間を費やしたことはありませんでしたが、これが理解できると確信しています。しかし、これが既に行われたかどうか、またはこれが新しいアイデアや概念ではないかどうかを知りたいです。

基本的に、システムの許可を1度しか超えない許可を持つスーパースーパーユーザーを確保する方法があるはずです。


注:受け入れられた回答は基準に最も適合すると感じていますが、@ CRの回答は本当に気に入っています。また。

ツリー(私)の上位に実際のユーザーを作成したいと思いますが、それを理解する時間ができたら、いつか座らなければならないと思います。

また、ここではUbuntuを選択しようとはしていません。私はそれについて否定的に感じた場合、私のメインのディストリビューションとしてそれを使用しません。


4
どのようなファイルについて話しているのですか?その理由は何ですか?「特定の不要なファイルがインストールされるのを防ぐ_」は、ファイルが(通常)存在しないことを示唆しているため、それらのファイルを停止することをお勧めします。しかし、「_ hatは更新中にファイルの置き換えを拒否します。」は、ファイルが既に存在し(おそらく望ましいコンテンツを含む)、新しいバージョンが必要ないことを示唆しています。
トライプハウンド

6
aptファイルの(上書き)を防ぐ方法はエラーにつながり、更新プロセスを中止する可能性があることに注意してください。apt「問題」が解決されるまで、アップデートまたはインストールを拒否します。
ドゥブ

6
「この問題を回避するためにインストール手順を変更するだけでは、私がここで興味を持っていることは絶対にありません。」そうかもしれませんが、それは一般的に述べられているように問題を解決するための正しい方法です。ルートを制限することができます(正式には、root-in-userlandはカーネルモードと同じアクセスレベルではありません)。それを実現するシステムはありますが、Unixの哲学と基本的なセキュリティ原則に反します。一般に、誰かが「部分」ルートを取得すると、「フル」ルートを取得するために使用する可能性のあるすべてをブラックリストから除外することは非常に困難です。信頼できるコードにのみルートを与えることをお勧めします。
ケビン

8
@mchid:ルートフルコントロールです。それが全体のポイントです。完全に制御できないようにするには、ルートのように見えないほど多くのものを拒否する必要があります(たとえば、カーネルモジュールのインストール、任意のデバイスのマウントなど)。rootとして実行したくない場合は、rootとして実行しないでください。代わりに、機能(ルートに相当するすべてのものを除く)を配布するか、ルート以外のプロセスに代わってルート操作を実行するpolkitdのようなデーモンを実行します。
ケビン

4
@mchid:それが問題です。プログラムが制限を回避する方法はたくさんあります。これらすべての方法をブラックリストに載せない限り、「制限付きルート」として実行するプログラムは、いつでも完全なルートになることができます。したがって、あなたのスキーム全体は、セキュリティ劇場のシャレードに過ぎません。
ケビン

回答:


83

必要な「ユーザー」は、LSM:Linuxセキュリティモジュールと呼ばれます。最もよく知られているのはSELinuxとAppArmorです。

これにより、特定のバイナリ(およびその子プロセス)が特定の処理を実行するのを防ぐことができます(UIDがであってもroot)。ただし、これらの操作gettyとその子プロセスを許可して、手動で実行できるようにすることができます。


2
しかし、UIDがルートである場合、そもそもアクセスを妨げるselinux権限を変更できませんか?
curious_cat

11
@curious_cat:はい、もちろん、「制限付きルート」プロセスが自身の許可を変更/引き上げる機能を拒否する必要があります!SELinuxはすでにそのことを考えて書いた人...
ピーターコルド

8
@curious_cat実行時に構成を変更することが完全に不可能になるように、LSMを構成できます。そのためには、再起動してカーネルパラメータを指定する必要があります。
ホークレイジング

5
@Joshua apt-getのコピーがRowhammerを使用している場合、心配する必要のある大きな問題があります。
ドラコニス

3
@corsiKaまず、あなたが実際にある人にマシンを起動することができ、人々制限したい時に、彼らが起動している間のシステムが脆弱であるため、マシンを。ネット上で再起動をトリガーすることは問題ありませんが、起動時に制御許可することはできません。第二に、コンピューターセキュリティのルールは、攻撃者が物理アクセスを取得すると、何もできないということです。これは、攻撃者がLN2 /ハードウェアなどを再配線する可能性があるためです。そのため、はい、マシンの起動を変更できる人は一般的にマシンに「勝った」とみなされます。
HTNW

51

rootユーザーの概念を誤解しています。

平易な英語でrootは、「木のてっぺん」にあります。

ある日、「スーパースーパーユーザー」、そして来月、「スーパースーパースーパーユーザー」(!)を決めるとしたらどうでしょう。木はどこまで「行きます」か。それを機能させるために、すべての権限と階層をどのようにシャッフルしますか?常にトップにいるのは誰ですか?誰かがトップにいる必要がありrootます。話の終わり。

ここに記載されているソリューション(AppArmorやSELinuxなど)は、これを実際に変更するものではありません。root許可とプロセスをより細かく制御することができます。

あなたの更新プロセスは望ましい結果に適さないように思えます。しかし、それはrootユーザーのせいではありません。物事を過度に複雑にするのではrootなく、最高レベルの許可ユーザーと考え、それから他のすべてのものと考えて、下に向かって作業する必要があります。

一部の人々はこれを書き留めることを知っていますが、ユーザー階層のレベルは高くなく、他のすべてのソリューションは、rootアクセス許可がどのように機能するかをわずかに異なる制御を与えるだけです。ただし、より高い権限を持つ新しいユーザーは作成されません。

可能な限り最高レベルのアクセス許可を表すrootため、「より多くのアクセス許可」を持つユーザーを持つことはできませんroot。「ルートよりも制御しやすい」などのフレーズを使用することは矛盾です- root完全な制御とすべての可能な許可を持っているので、その上でできることは何もありません。


話の終わりではなく、最上位にいるでしょう。ユーザー階層の上位レベルがないため、より高いユーザーを作成したいのはまさにその理由です。
mchid

しかし、それは私が望むものの一種です。ルートの許可とプロセスを制御して、ルートの許可を拒否することができます。SELinuxまたはAppArmorで新しいユーザーを作成せずに、どういうわけかroot権限を拒否できる場合、新しいユーザーは必要ないと思います。ルートよりも完全な制御が必要です。
mchid

16
「より多くの権限」を持つユーザーをにすることはできませんroot。それが問題です。作成しようとしているユーザーは、基本的にrootユーザーです。root特権を持つユーザーを作成するなど、別の方法でこれにアプローチする必要があります。その後、より細かく制御したい特定のユーザーを拒否します。あなたが求めていること(「ルートよりも制御しやすい」)は不可能です。
アンディ

@mchidでは、実際にやりたいことは、現在のルートユーザーの名前をmchidに変更し、rootという新しいユーザーを作成して、apt-getなどに新しい非ルートユーザーを使用させることですか?
オダリック

一部のシステムでrootは、ハードウェアに直接アクセスする権限がありません。カーネルモジュールの読み込みを無効にすると、ルートをハードウェア全体の制御からロックアウトしたままにできます(/dev/mem、およびそのようなもの)。SATAまたはNVMeコントローラーと直接通信するapt-getを使用しないため、ファイルシステムのアクセス許可にはあまり関係ありません...しかし、技術的には、「より多くのアクセス許可root」状態があり、カーネルモードと呼ばれます。:P
ピーターコーデス

26

ファイルまたはディレクトリの変更/削除を禁止したい場合は、それらに不変フラグを設定するだけです。

chattr +i <file>

フラグが削除されない限り、rootでさえも何もできません。また、コンテナ/ネームスペースシステムを使用してルートアクセスを防止することもできますが、必要なものが多すぎるようです。


11
ただし、rootはフラグを削除できます。
セバスト

10
aptは、ほとんどすべてのものと同様に、chattrを使用してそのフラグを削除しません。
CR。

13
@sebasth:正しいですが、Apt、dpkg、およびパッケージごとのインストールスクリプトは(通常)ファイル属性を変更しません。代わりに、不変フラグを使用してファイルを変更しようとすると、失敗して文句を言います。
デビッドフォースター

4
@TripeHoundでは、OP apt-getはファイルの置き換えに成功したいのに、そのファイルはそのままにしておきたいですか?それは私が言うあえて矛盾している。
ドミトリーグリゴリエフ

3
@DmitryGrigoryev 成功したと思っているようですが、1つ以上のファイルは変更されていません。彼らはどのファイルや理由を言うのではなく、あなたが言うように、幾分矛盾している-そして、将来「奇妙な行動」をする傾向がある。apt-get
トライプハウンド

9
  • スーパースーパーユーザーを持つ代わりに、ルートを制限できます。gnu / linuxでファイル許可などを設定するさまざまな方法を参照してください

  • AppArmorとSELinuxもあります。

  • またsudo、configureを使用して、完全なルート権限を与えないようにします。ユーザーが事前に合意した引数を使用して事前に合意したコマンドのみを実行できるように設定できます。

  • 仮想化を使用してルートを制限することもできます。

    • cgroups、名前空間、chrootなど(dockerはこれを行います)
    • Xen
    • Virtualbox
  • 参照してくださいetckeeper:このツールの改訂は、コントロール/etcディレクトリを、そして傾向と同期します。デフォルトでは、安全ではないため、悪意のあるインストールによって妨害される可能性がありますが、ファイアウォールの付いたバックアップリポジトリに変更をプッシュすることもできます。

  • ファイアウォールバックアップリポジトリを使用した、一般的なリビジョン管理の使用。これは、偶発的で意図的な破損やハードウェア障害の助けになります。


ファイアウォールバックアップリポジトリは、別のマシン、インターネット、または別の仮想マシン(または仮想マシンのホスト)に配置できます。


8

通常の操作ではほとんどすべてのシステムへのアクセスを必要とするAPTのようなソフトウェアの場合、制限は問題です。システムの特定の部分にアクセスできないようにしたとしても、悪意のあるディストリビューターが回避する可能性は十分すぎる可能性があります。たとえば、ライブラリまたは単にバイナリを置き換えるか、悪意のある構成変更を追加することにより、無制限のルートが最終的に使用されます。

制限をどの程度設定するかに応じて、一部のインストールスクリプトが破損することが予想されます。

アプリケーションとユーザーを制限する方法については、AppArmorまたはSELinuxポリシーを作成できます。よりサポートされるポリシーはディストリビューションに依存します:DebianベースはAppArmorをよりよくサポートしますが、Fedora / RHELベースのディストリビューションはデフォルトでSELinuxを有効にします。

AppArmorとSELinuxは両方とも、特定のアクションを許可(または拒否)するルールを含むホワイトリストポリシーで機能します。ポリシーはexecでプロセスに適用されます。同様に、ログイン時にポリシーがプロセスに適用されると、ユーザーを制限できます。よく考えられたポリシーは回避できません(カーネルのバグが考慮されていない場合)。ルート(uid 0)として実行されている制限されたプロセスは、設定されたポリシーによって制限され、ポリシーで明示的に許可されていない限り変更できません。

AppArmorポリシー言語は、ブラックリストポリシーを構築するために使用できる拒否ルールを定義します。AppArmorから始めるのに適した場所は、AppArmorのmanページwiki、およびのディストリビューションの既存の構成を調べることです。/etc/apparmor.d/

SELinux wikiには、SELinuxの管理および開発に関する資料が豊富に用意されています。SELinux 参照ポリシーはgithubでホストされています。


7

誰も適切なピン留めについて言及していないとは信じられません...

数年前、MicrosoftはWindows 10マシンが古いSamba NT4ドメインコントローラーと通信できないようにするパッチをリリースしました。問題が見つかったとき、Sambaパッケージを現在のバージョンのままにするように固定し、apt引き続き正常に機能しました。

完全なDebianウォークスルーはプロセスをうまく説明しています:

/etc/apt/preferences(または新しいファイルの下で/etc/apt/preferences.d/)、どのパッケージとバージョンを指定するには、いくつかのテキストを追加します。

Package: samba
Pin: release v=3.6.6-6+deb7u7
Pin-Priority: 900

正確な構文についてはドキュメントを確認してください。ただし、これはパッケージバージョンを固定するための迅速で汚い方法です。ルート常にできるので、ルートそれをバイパスできますが、これはパッケージマネージャーがあなたのパッケージを自動的にアップグレードしようとする問題を解決します。

注:この回答は、XYの問題があると仮定しています


私はaskubuntuで多くのXY問題に自分で答えました。しかし、aptは単なる例であり、私をアイデアに導きました。私は、全体の「電源破損と絶対電源破損の絶対的な」側面にもっと興味があります。私自身のシステムに対する完全かつ絶対的な力が、そもそも私をLinuxに導いたのです。私の力がルートに対して常に絶対的であるとは限らないことを理解することは、一種の動揺です。絶対的な力のアイデアは魅力的です。
mchid

また、それは少しXYの問題だと思いますが、Yは「rootがスーパーユーザーであるときにrootへの許可をどのように拒否するのですか?」
mchid

1
@mchidは、rootに対する許可を拒否することではなく、rootとして実行されているプログラムに対して何かを拒否することです。
ジョンキーツ

6

実際には非常に簡単です。

ルートはあなたの「スーパースーパーユーザー」です

「admin」というアカウントを作成し、不要なルート以外のすべてのルート権限を彼に与えます。

次に、bobというユーザーを作成し、「管理者になる」ようにします。suまたはsudoを使用します。

これで、通常のユーザー(bob)に、管理スタッフ(admin)を実行できるスーパーユーザーとスーパースーパーユーザー(root)ができました。

「ルート」という名前を別の名前に変更したい場合は、それもできます。技術的には、ユーザーID(0)のみが重要です。


通常のユーザー(bob)、管理スタッフ(admin)を実行できるスーパーユーザー、およびスーパースーパーユーザー(root)がいる場合、rootはバックグラウンドプロセス、cronジョブ、およびユーザーID(0)として他のもの?
mchid

あなたがそれらをしたくない場合ではありません。ほとんどのサービスでは、どのユーザーが作業を行うかを選択できます。adminユーザーがプロセスを実行しているユーザーになるように設定できます。いくつかの例外がありますが、多くはありません。
coteyr

これらのプロセスをすべて個別に設定する必要はありませんか?
mchid

3
これは、標準の規則を破ろうとすると起こります。* nix環境の許可システムの方法と理由をよりよく理解する必要があると思います。
ショーナ

2
Shaunaに同意します。* nix許可システムについての基本的な理解が不足しているようです。それは非常に強力ですが、ウィンドウのようなものではありません。
coteyr

3

特定のファイルがインストールされないようにするだけの場合、ルート権限を制限することはこれを行う方法ではありません。APT(および他のほとんどのパッケージマネージャー)がファイルをインストールできない場合に救済されるため、特定のユースケースでは従来の回答(不変ファイルまたはLSM)が機能しないことにも注意してください。

あなたが聞きたい本当の質問は:

APTが特定のファイルをインストールするのを防ぐ方法はありますか?

それは、あなたが複数のレベルで求めているものとは全く異なるものです。

今、その質問に関して、私は100%確信していませんが、特定のファイルがインストールされないようにするオプションが他の多くのパッケージマネージャーにあることを知っています(たとえば、GentooのPortageシステムにはINSTALL_MASK=実際にシェルを受け入れるオプションがあります-インストールしないもののスタイルマッチングパターン)。私は、APT(またはdpkg自体)にそのようなオプションが存在することを賭けたいと思っています。


本当に、「APTが特定のファイルをインストールするのを防ぐ方法はありますか?」私の質問ではありません。これは単なる例であり、疑問を思い起こさせたものは何ですか。新しいFirefoxにはアドオンが同梱されており、ユーザーが新しいアップデートで削除した後でもこれらのファイルがインストールされます。これは実際には問題ではありません。これが、私が自分のシステムをさらに制御したいことを実感させた理由です。ただし、このようにいくつかの質問に自分で答えたので、ここでのロジックに感謝します。入力に感謝します。
mchid

dpkg-divertはこれを行います:unix.stackexchange.com/a/157896/70847
mchid

1

バックアップコピーを安全な場所に置きます。インストール/更新後、そのバックアップから特定のファイルをすぐに置き換えます。したがって、インストールを台無しにするエラーはありませんが、保持したいファイルを取り戻すことができます。


1

マウントされたドライブから作業する

これは主に概念的な答えですが、私はそれが機能し、あなたが達成したいものと精神的にならなければならないと思います。

システムXを稼働システムとし、システムYを制御する他のシステムとします

  1. XのドライブとしてYからディレクトリをマウントします
  2. いくつかの例外を除き、Xのrootユーザーがこのマウントされたドライブ内のすべてに対する権限を持つように権限を設定します

これで、ほぼすべてを実行できる「作業ルート」があり、システムYの実際のルートアカウントである「スーパールート」があります。


実行中のシステムでこれを実行したいのですが、このアイデアは気に入っています。
mchid

1

Xenハイパーバイザーのようなタイプ1ハイパーバイザーを実行し て、仮想ゲストとして通常のOSをホストさせることができます。ハイパーバイザーは、ゲストOSが実行される(仮想)ハードウェアを制御するため、ルートよりも「深い」レベルで仮想ゲストOSを制御します。

ハイパーバイザーをプログラムして、アクセス許可の変更、バックアップの作成と適用、ゲストOSでの特定の変更または指示のフック、追加機能、検証などの挿入を含む、さまざまな方法でゲストOSを操作できます。 「rootでさえできないことをする」ために、「ユーザー」(実際にはハイパーバイザーの機能)を持つUNIXタイプシステムを実装する

このアプローチはおそらくやり過ぎだという私の感覚


ハイパーバイザーは、root権限を持つユーザーがゲストVMで実行したいことをどのように防止するのですか?
fpmurphy

この答えは大丈夫ですが、文法的に間違っています(その後、間違った方法で読んだり、少なくとも曖昧なものを読んでいます)。修正しました。
ctrl-alt-delor

1
@ fpmurphy1ハイパーバイザーは、システムコールをフックしたり、ポリシーを適用したりして、rootユーザーまたはゲストOSの他の部分に任意の制限を適用できます。あなたはいくつかの実際の企業のユースケースか何かけれども...持っていない限り、これはあまりにも多くの仕事があるので、多分私の答えは良くありません
ネイサン・スミス

@ ctrl-alt-delor修正していただきありがとうございますが、文法が問題だとは思いません。私は、私も言って何を意味するのか明確に、&​​Iは、私の考えが最初では明らかではなかったことをフィードバックに感謝
ネイサン・スミス

1
完全ルートのゲスト内の@ fpmurphy1。ただし、ホスト上のルートと同じルートではありません。したがって、ホストルートよりも小さいルートです。Dockerは、物事をより統合することを許可しますが、それでもルートに制限を課します。
ctrl-alt-delor

1

見てくださいのcgroup、Linuxの名前空間のようにそれらに基づいて、この目標の種類だけでなく、ツールを達成するための別の方法として、ドッカーLXDを

これらのツールを使用すると、特に、「root」として実行されているプロセスがファイルシステムのどの部分を表示できるか、どのプロセスを表示できるか、「root」ユーザーに特定の機能のみを提供できます。


0

アンインストール sudo

へのアンインストールsudoとシンボリックリンク/bin/su/bin/falseどうですか?それをroot経由sshしてログインできないことを確認し、システムをロックダウンします。

これがrootSuper * Superユーザーになり、他のすべてのユーザーはそれに従属します。

更新中に置換されたファイルについては、更新を行わないでください。より現実的にファイルのパーミッションを変更する440か、444彼らは書き込みができないようにします。または、それらをgitリポジトリに配置して、上書きされた場合に元に戻すことができるようにします。


ご存知のように、私はまだ更新を行いたいのですが、rootが通常行うほとんどすべてのことをrootに任せたいです。しかし、親の権威が子孫にできるように、「それをしないでください」または「いいえ、あなたはそれをすることはできません」とルートに言いたいです。現在のように、ルートは私のシステムの親権威のようなものであり、すべての小さな子供たちは「お母さんはいいですか?」と言います。sudoを使用する場合。これは大丈夫です。しかし、この惑星のほぼすべての人は誰かの子孫です。彼らは理解していない時に幼児が自己認識の前になりますように、ここでいくつかの答えがあるように思える
mchid

。。。おばあちゃんとおじいちゃんは、ママとパパの母親と父親です。おじいちゃんに私のシステムに住むようにお願いしたいのは、今、ルートは家のお父さんであり、おじいちゃんはお父さんがお父さんの父親だから何をすべきかを伝えることができるからです:)
mchid

sudoの権限を持つ人をあまりにも多く追加したようです。sudoers選択したユーザーのみが事前に選択したコマンドにsudoできるようにファイルを調整します。
ユーザー176717

ルートを含むsudoersファイルには2人のユーザーしかいません。一部の人々が私の質問を理解していないように見えることと、私が達成したいことを説明するために、私は直mileを使用しようとしていました。
mchid

非常に幼い子供が母親とパパに親がいないと感じるのと同じように、人々はrootよりも高いユーザーは存在できないと感じているようです。また、私は投票しませんでした。
mchid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.