web-dev-qa-db-ja.com

組み込みLinuxデバイスのセキュリティに関する重要事項

ハードウェアプラットフォームとしてRaspberry Pi 3を使用した防犯カメラ製品のプロトタイプを作成しています。このカメラには、インターネット経由でクラウドに接続する機能と、インターネットが中断した場合のオフライン処理があります。

現在、セキュリティのために、SELinuxを強制モードで有効にしており、以下を検討しています。

  • dm-verity
  • ファイルベースの暗号化のためのeCryptFS

Linuxのセキュリティ関連の記事を少し読んだ後、話されている特定のキーワードに出くわしました。

  • カーネルの強化
  • ネットワーク強化

カーネルとネットワークの強化とはどういう意味ですか?カーネルの強化に役立つ特定のカーネル構成はありますか?ネットワーク側でブロックする必要があるガイドラインはありますか?

Androidとは異なり、Linuxシステムに多数のアプリケーションをインストールして実行するつもりはありません。必要なジョブを実行して実行するアプリケーションはほとんどありません。実際には、何らかの方法でアクセスできる他のアプリケーションとして実行をブロックする必要があります。

7
sob

あなたの考慮事項

特にハードウェアのキーを融合してTCBをさらに削減できる場合は、dm-verityを使用することをお勧めします。これは、システムが永続的に危険にさらされるのを防ぐだけでなく、整合性を確保して改ざんを非常に明白にするのに大きく役立ちます。クイックWeb検索では、Raspberry PiのいくつかのTPM実装が表示されます。これにより、デバイスにSRTM(Static Root-of-Trust for Measurement)を実装でき、測定されたブートおよびリモート認証を実行して、dm-verityを強化できます。デバイスの整合性を高めます。

ファイルシステムレベルの暗号化は有用ですが、データをクラウドにアップロードする場合は、その動作から生じるリスクにも注意する必要があります。ファイルシステムレベルの暗号化では、安全でない「クラウド」ホストにアップロードされたデータは保護されません。理想的には、代わりにクライアント側の暗号化を使用します。ビデオファイルなどのみをアップロードする場合は、暗号化してリモートサーバーにアップロードする前に、NaCl/libsodiumなどの使いやすい一般的なライブラリで暗号化できます。また、パスワードはどこかから来る必要があることも覚えておいてください。ユーザーが自分でパスワードを選択しない限り、(デバイス上のデータの)機密性は提供されません。デバイスにパスワードを保存することは悪い考えです。

これよりもさらに重要なのは、これから行うすべてのことは、正式な脅威モデルの開発です。敵対者が誰であるか、ユーザーの資産は何か、そしてそれらの価値は何かを知り、それをすべて状況に合わせる必要があります。攻撃ツリーを作成して使用します。リスク評価と脅威のモデリングは、一般に製品のセキュリティにとって非常に重要です。

カーネルの強化

これは、カーネルのセキュリティを強化して、悪用のリスクを減らすためのあらゆるアクションを指します。これは、セキュリティ指向のパッチでカーネルにパッチを適用することから、攻撃対象を減らすために単にsysctlを調整することまで、幅広いクラスのテクニックです。

  • Grsecurityなどのカーネルパッチは、カーネルの悪用をさらに困難にします。現在、grsecurityは有料の顧客を除いて閉鎖されているため、予算の範囲を超えている可能性があります。それを使用できる場合、またはそのフォワードポートを使用すると、構成だけで実現できるよりもかなり多くのカーネル強化機能を利用できます。
  • カスタムカーネル構成により、不要なコードや機能をカーネルから削除したり、ストックエクスプロイトを壊したりすることができます。たとえば、多くのカーネルエクスプロイトでは、あいまいなドライバーや複雑なドライバーを使用する必要があります。組み込みシステム用に開発しているので、おそらくカスタムカーネル構成をすでに使用しているでしょう。必要なドライバーのみに絞り込み、ユーザー名前空間、vsyscalls、非特権eBPFなど、特に問題のある機能を無効にする必要があります。これは、カーネルを強化する最も重要な方法の1つです。
  • Sysctlリスト全体を調べると、セキュリティに関連しているものの、理想的ではないデフォルト値を持っているものが多く表示されます。 sysctlを調整することで、非特権ユーザーの名前空間、eBPF、JITなどを無効にできます。vm.mmap_rnd_bits sysctlを増やすことで、ASLRによって提供されるランダム性を増やすなどのこともできます。さらに、多くのカーネルの脆弱性がoopsまたはカーネルの警告をトリガーするため、sysctlがoopsesなどのさまざまなイベントでカーネルをパニックすることを可能にすることでセキュリティを大幅に向上させることもできますが、デフォルトではカーネルは何も起こらなかったかのように継続し、エクスプロイトが成功する可能性があります。これは組み込みデバイスであるため、すぐにパニックして再起動するのが理想的です。
  • カーネルモジュールの署名は、署名されていないモジュールが読み込まれないようにするために使用されます(理想的には、ハードウェアを制御するときに、必要なドライバーのみを使用して非モジュラーカーネルを構築します)。署名キーは、カーネルのコンパイル中にオフラインで作成できます。これを他のセキュリティ機能(grsecurityが提供する機能など)とともに使用して、rootユーザーでさえシステムを危険にさらすのを防ぐことができます。カーネルをルートから保護することは困難ですが、不可能ではありません。

Grsecurityの使用は、これまでで最も効果的なカーネル強化の形式ですが、製品ラインの予算によっては、費用対効果が高い場合とそうでない場合があります。カスタムカーネル構成は2番目に効果的ですが、カーネル構成を適切に理解する必要があります。セキュリティの専門家を雇ってこれをすべて行うことを強くお勧めします。そうしないと、重要なセキュリティ機能を誤って無効にしたり、安全でないオプションを有効にしたりする可能性があります。 Kconfigのヘルプセクションは、特定のオプションのセキュリティへの影響を理解するには必ずしも十分ではありません。たとえば、「デバッグ」機能の多くは、さまざまな健全性チェックなど、実際にはセキュリティに非常に役立ちます。 Linuxカーネルとそのさまざまなサブシステムについて理解します。これにより、デバイスのセキュリティを大幅に向上させることができます。

ネットワーク強化

ネットワークの強化とは、ネットワークの悪用ベクトルと横方向の移動の難易度を高めることを指します。何が適切なネットワーク強化を構成するかは、特定のセットアップとネットワークトポロジに大きく依存します。最も単純な場合、基本的なファイアウォールルールが含まれますが、より広範囲にすることもできます。

  • 着信接続をホワイトリストに登録することは、安全でない可能性のあるサービスを保護するために重要です。発信接続をホワイトリストに登録することは、悪意のあるソフトウェアを妨害したり、ソフトウェアの誤動作を防いだりするためにも役立ち、C2を介したデバイスの制御を困難にします。
  • カーネルの強化と同様に、さまざまなsysctlを調整して、ネットワークのセキュリティを向上させることができます。正確な調整は、ユースケースに大きく依存します。たとえば、IPv6を無効にすると、不要な場合に攻撃対象領域を減らすことができます。ルーティングにのみ役立つ機能を無効にすると、デバイスがパケットをリダイレクトするために悪用される可能性を減らすことができます。その他の調整により、パフォーマンスが向上し、DoS攻撃に対する耐性が向上します。
  • 不要なプロトコルは無効にする必要があります。 DCCPなどの多くのプロトコルには脆弱性の履歴があり、デフォルトで有効になっているため、これはリモートの攻撃者に対するカーネルの強化にとって特に重要です。理想的には、デバイスが正しく動作するために他のプロトコルが絶対に必要でない限り、カーネルはTCP、UDP、およびICMPのみをサポートする必要があります。

通常、ネットワークの強化は、複数の相互接続されたコンポーネントを持つインフラストラクチャ全体に関連します。リモートでファイルをアップロードするためにサーバーに接続するだけの単一のデバイスの場合、ネットワークの強化はカーネルの強化に非常に近くなります。つまり、不必要な攻撃対象領域を排除します。

7
forest