問題タブ [linux-capabilities]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ファイル機能は、一度実行されるとプロセスに転送されません
昇格した機能を必要とするプログラムを作成しようとしています (単純に sudo で実行するのではなく)。ただし、 setcap を使用して設定した機能は、一度実行するとプロセスに転送されないようです。この問題は、複数の実行可能ファイルで発生し、さまざまな機能を使用しています。
このコードは cap_set_file() を使用して、CLA として渡されたファイルに CAP_NET_RAW 機能を付与します。(なぜこれが必要なのか聞かないでください。)
gcc でコンパイルした後:
私はそれに機能を与えます:
getcap tt を使用すると、出力は次のようになります。
ただし、プログラムを実行すると、次の出力が得られます (test-client は、生のイーサネット ソケットを作成する実行可能ファイルです)。
ただし... sudoを使用してプログラムを実行すると、すべてのプロセス機能が正常に機能します。
ターゲット ファイル「test-client」の機能が適切に設定されます。
ただし、CAP_NET_RAW を使用しても、クライアントは EPERM での socket() 呼び出しに失敗します。CAP_NET_ADMIN も必要な場合に備えて設定してみました。同じ問題。上記のプログラムで CAP_SETPCAP を使用してみました。サイコロはありません。実行可能ファイルの機能が実行中のプロセスに入っていない切断に絞り込んだと確信しています。
ここで何が欠けていますか?
編集、翌朝:
さて、さらにテストを行ったところ、このコードは Raspberry Pi で問題なく動作することがわかりました。プライマリ マシンで LXTerminal を使用して Lubuntu 16.04 を実行していますが、これが失敗しています。LXTerminal 内およびテキストのみのシェルでも失敗します。多分それはOSのバグですか?
Lubuntu マシン (cat /proc/version):
円周率:
もう一度編集: --
インストールに使用したのと同じ USB キーを使用して、別のマシンでテストしました。わずかに異なる /proc/version:
正常に動作します。私は困惑している。
docker - 機能を持つ非 root ユーザーとして docker コンテナー内でアプリを実行する
root 以外のユーザーを使用する docker コンテナー内でポート 507 をリッスンする単純な python UDP エコー サーバーを実行しようとしました。Dockerfile は次のようになります。
507 は既知のポートであるため、docker run を発行するときに NET_BIND_SERVICE 機能も追加しましたが、それでもエラーが発生します。
機能を調べると、root 以外のユーザーを使用している場合、有効な機能が設定されていないことがわかりました。
root 以外のユーザーと特定の機能を使用して、Docker コンテナーでプログラムを実行する方法を知っている人はいますか?
linux - Linux の init_user 名前空間とは?
Linux カーネル コードを参照しているときに、次の 2 つの関数が に見つかりましたkernel/capability.c。
1)
2)
init_user最初の関数で言及されている名前空間は何ですか?
私の知る限り、プロセスには機能があります (プロセスのさまざまな機能セットについては今は気にしないでください)。 ?
同じファイルの の定義を見るとcap_get_target_pid()、ユーザー名前空間を気にせずに、指定された pid でプロセスの機能を取得することについて話しているだけです。これは私にはより自然に見えます。
ulimit - setuid または機能 CAP_SYS_RESOURCE を使用してプログラムでリアルタイム優先度の ulimit ハード制限を上げる方法は?
SCHED_FIFOLinuxリアルタイム クラスでプログラムを実行したいと考えています。ユーザーのハード リミットRTPRIOを 0 に設定したままにし、単一のプロセスに対してのみハード リミットをプログラムで引き上げることをお勧めします。CAP_SYS_RESOURCEプロセスを許可してハードリミットを上げることを許可すると、たとえばman setrlimit 2と広く主張されています。
ソフト制限は、カーネルが対応するリソースに適用する値です。ハード リミットはソフト リミットの上限として機能します。非特権プロセスは、ソフト リミットを 0 からハード リミットまでの範囲の値に設定し、(不可逆的に) ハード リミットを下げることができます。特権プロセス (Linux では、CAP_SYS_RESOURCE 機能を持つプロセス) は、いずれかの制限値を任意に変更できます。
しかし、私はこれをうまく機能させることができないようです。テストコードは次のとおりです。
これは、特別な権限がなくても期待どおりに機能し、ハードリミットは 99 です。
sudo を使用して 0 のハード リミットで期待どおりに動作します。
ただし、setuid root の場合は期待どおりに動作しません。
また、機能 CAP_SYS_RESOURCE およびすべての機能で予期せず失敗します。
ここで何が欠けていますか?
linux - /proc/ を読む/fd/フルルートアクセスなし
(ネットワーク)inodeが与えられたプロセスを見つけるために依存するプログラム(https://github.com/raboof/connbeat )があります。/proc/[pid]/fd/*
/proc/[pid]/fdrootでしか読めませんが、セキュリティ上、権限は極力落としたいと思っています。
完全なルート権限を必要とせずに、プロセスと inode 間の関係に (効率的に) 到達できる方法はありますか? おそらく、機能を使用して選択的にアクセスできるシステムコールですか?
linux - コンテナーがポート 80 でリッスンできるようにすることの副作用
Docker コンテナー間のサービス ポート管理を簡素化するために、含まれている HTTP サービスがそれぞれのコンテナーの IP アドレスの HTTP の既定の TCP ポート 80 でリッスンできるようにしたいと考えています。
1025 未満のポート番号をリッスンすることは、従来は などの特別な権限を持つユーザーに制限されていましrootた。私が理解している限り、これの理由は、マルチユーザー システムで非特権ユーザーがマシン全体の権限のある HTTP サービスとして機能することを禁止するためです。
新しい Linux バージョンでは、Linux カーネル機能を適用することで、これを特定の実行可能ファイルに許可することもできますCAP_NET_BIND_SERVICE。--add-capこれを Docker コンテナーで機能させるには、Docker クライアントのフラグまたは Docker-Composecap_addセクションを使用して、この機能を Docker コンテナー自体に適用する必要があるようです。
理論的には、このポート番号の制限の理由は、この場合は廃止されました。Linux カーネルのネットワーク ネームスペースにより、コンテナー内のプロセスは、コンテナー内のプロセスに排他的な独自の IP アドレスにのみバインドできるためです。
私の質問は、これを行うことについて重大な警告があるかどうかです。これは、私が考えていない方法でセキュリティ上の問題になる可能性がありますか? または、これを行うことについて他に問題はありますか?