今週、PowerShellをいじっていましたが、実行するにはスクリプトに署名する必要があることがわかりました。Linuxには、bashスクリプトの実行の防止に関連する同様の安全な機能がありますか?
これに似ている唯一の機能は、特定のキーを必要とするSSHの機能です。
noexec
-verityで署名されたブロックデバイスの読み取り専用パーティションにフラグが立てられていない唯一のファイルシステムを配置します。
今週、PowerShellをいじっていましたが、実行するにはスクリプトに署名する必要があることがわかりました。Linuxには、bashスクリプトの実行の防止に関連する同様の安全な機能がありますか?
これに似ている唯一の機能は、特定のキーを必要とするSSHの機能です。
noexec
-verityで署名されたブロックデバイスの読み取り専用パーティションにフラグが立てられていない唯一のファイルシステムを配置します。
回答:
ユーザーがスクリプトを実行する機能をロックしている場合sudo
は、そのdigest
機能を使用できます。
実行前にsudoers
検証されるスクリプト/実行可能ファイルのハッシュを指定できますsudo
。したがって、署名と同じではありませんが、sudoersも変更されない限り、少なくともスクリプトが変更されていないという基本的な保証が得られます。
コマンド名の前にDigest_Specが付いている場合、指定されたSHA-2ダイジェストを使用して検証できる場合にのみ、コマンドは正常に一致します。これは、sudoを呼び出すユーザーがコマンドまたはその親ディレクトリへの書き込みアクセス権を持っている場合に便利です。次のダイジェスト形式がサポートされています:sha224、sha256、sha384、sha512。文字列は、16進形式またはbase64形式で指定できます(base64はよりコンパクトです)。openssl、shasum、sha224sum、sha256sum、sha384sum、sha512sumなど、16進形式でSHA-2ダイジェストを生成できるユーティリティがいくつかあります。
はいといいえ。
Linuxソフトウェアの配布は、Windowsソフトウェアの配布とは多少異なります。(非組み込み)Linuxの世界では、ソフトウェアを配布する主な方法は配布(Ubuntu、Debian、RHEL、Fedora、Archなど)を介した方法です。すべての主要なディストリビューションは、約10年間にわたってパッケージに体系的に署名しています。
ソフトウェアが独立して配布される場合、ソフトウェアの出荷方法を決定するのはベンダー次第です。優れたベンダーは、主要なディストリビューションと互換性のあるパッケージソースを提供します(Linuxのすべてに統一されたディストリビューションメカニズムはありません。ソフトウェアディストリビューションはディストリビューションの主な差別化ポイントの1つです)。Linuxディストリビューションはサードパーティベンダーの署名機関としてはほとんど機能しません(CanonicalはUbuntuパートナーでこれを行いますが、ごく少数のベンダーのみを対象としています)。キーを信頼するかどうかを判断するのはユーザー次第です。
ネイティブ実行可能ファイル、データファイル、または複数のファイルで構成されるソフトウェアパッケージから、単一のスクリプトで構成されるソフトウェアパッケージを選択する特別なメカニズムはありません。ソフトウェアパッケージの検証はスクリプトの実行と完全に直交する問題であるため、一般的なスクリプトインタープリターには署名検証も組み込まれていません。
Windowsはファイルにそのオリジンを注釈し、オリジンが「ローカル」ではなく「ダウンロード」されたファイルを実行するにはユーザーの確認が必要だと思います。Linuxには実際に同様のメカニズムはありません。最も近いのは実行権限です。ダウンロードしたファイルには実行権限がありません。ユーザーは明示的に有効にする必要があります(chmod +x
コマンドラインまたはファイルマネージャーの同等のアクション)。
Linuxには、デジタル署名に基づいてbashスクリプトの実行を制限する機能はありません。
バイナリ実行可能ファイルの認証に関するいくつかの作業があります。詳細については、https://lwn.net/Articles/488906/を参照してください。
一言で言えば、「いいえ」。
Linuxは実際には実行可能ファイルとスクリプトを区別しません。#!
冒頭には、入力を評価するために実行するためにどのようなプログラムカーネルに伝えるための方法ですが、それは、スクリプトを実行できる唯一の方法ではありません。
たとえば、スクリプトがある場合
$ cat x
#!/bin/sh
echo hello
次に、コマンドでこれを実行できます
$ ./x
これにより、カーネルはそれを試行して実行し、見つけて#!
から効果的に実行します/bin/sh x
代わりにます。
ただし、これらのバリアントのいずれかを実行することもできます。
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
あるいは
. ./x
カーネルが署名を強制しようとしても exec
レイヤーでとしても、スクリプトをパラメーターとしてインタープリターを実行するだけでこれをバイパスできます。
つまり、署名コードはインタープリター自体に存在する必要があります。そして、ユーザーが署名強制コードなしでシェルの独自のコピーをコンパイルするのを止めるものは何ですか?
これに対する標準的な解決策は、署名を使用することではなく、などの必須アクセス制御(MAC)を使用することSELinux
です。MACシステムでは、各ユーザーがレイヤーの実行と移行を許可される内容を正確に指定できます。したがって、たとえば、「通常のユーザーはWebサーバーとCGIプロセス/var/httpd
以外は何でも実行できますが、ディレクトリの内容にしかアクセスできません。他のすべては拒否されます」と言うことができます。
This means that signing code would have to be in the interpreter itself. And what would stop a user from compiling their own copy of a shell without the signing enforcement code?
実行を許可していないすべてのユーザーが署名鍵を持っていない場合は、それを行うだろう、符号なしの実行可能ファイル。これにはすでにさまざまな* nixプロジェクトがあります。
すぐに思い浮かぶ反論的な質問は、「ユーザーが作成したプログラムをユーザーが実行できないようにしたいのはなぜですか?」というものです。
*多くの人がLinuxを使い始めるにつれて、これはおそらくますます真実ではなくなってきています
システムの進化が異なる理由は、Linuxには「exec」ファイル属性があり、Windowsはファイル拡張子を使用して実行可能性を判断するためです。
そのため、Windowsでは、ユーザーをだまして、「。exe」、「。bat」、「。scr」の拡張子を持つファイルをダウンロードするように簡単に設定できます。そのファイルをダブルクリックすると、任意のコードが実行されます。したがって、このリスクを軽減するために、オリジントラッキングと実行可能/スクリプト署名の大きなメカニズムが構築されました。
Linuxでは、ユーザーにファイルを取得できる場合がありますが、「exec」ビットを簡単に強制的に設定することはできません。さらに、ファイルシステム全体を「noexec」にすることもできます。
いずれにしても、インタープリターを呼び出すことにより、スクリプトを明示的に実行できます。実行時にシェルスクリプトを作成して「sh」にパイプするか、「sh -c」を実行することもできます。
カスタムでは、多くのアーカイブプログラムは、含まれているファイルの実行ビットを保持しません。これにより、任意の実行可能ファイルを実行できなくなります。よくほとんど。
重要なのは、別の回答で説明されたように、実行ビットがなくても、そのようなスクリプトをに直接渡すことを妨げないということですbash
。このようなスクリプトのほとんどはbash
スクリプトであると言えますが、シバンはどのプログラムもインタープリターとして指定できます。これは、実行可能なセマンティクスを無視することにした場合、適切なインタープリターを実行するのはユーザー次第であることを意味します。
これはそれほど多くはありませんが、これは、カーネルとシェルだけを使用して、信頼できない実行可能ファイルを* nixes で実行することの防止をほぼカバーしています。
コメントの1つで述べたように、もう1つの保護層がSeLinux
あります。これは、一連のルールに基づいてファイルの発信元を追跡します。セットアップは、SeLinux
たとえば、あなたがコピーして、周りのファイルを移動しても、ルートは、インターネットからダウンロードした実行可能なビットがセットされた実行可能ファイルを実行することができません。そのようなファイルは、質問で述べたものとは異なり、署名をチェックする別のバイナリーでのみ実行できるというルールを追加できます。
したがって、最終的には、一般に事前にインストールされているツールの構成の問題であり、答えはyesです。
tar
は保持されます。
-p, --preserve-permissions, --same-permissions
ファイル許可に関する情報を抽出することを意味します(スーパーユーザーのデフォルト)
touch permtest; chmod +x permtest; tar cf permtest.tar.gz permtest; rm permtest; tar xf permtest.tar.gz; ls -l permtest
-ここでは実行可能です。私はルートではありません。