2025年までに、世界は約200ゼタバイトのデータを保存するようになります。そのデータは、パブリック、プライベート、オンプレミス、またはクラウドストレージ、PC、ラップトップ、スマートフォン、さらにはモノのインターネット(IoT)デバイスのいずれかに保存されます。予測では、インターネットに接続されたデバイスの数も2025年には約750億に増加すると予想されます。私たちの一部や、ITのバックグラウンドが少ない人々にとって、これらの数は何もありません。しかし、セキュリティ愛好家にとっては、ますます多くのデータが危険にさらされているため、これは心配です。
オープンソーステクノロジーとデータベースの世界では、セキュリティは重要なトピックの1つです。時々、セキュリティに関連する多くの新しい発明や開発があります。それらの1つは、Security-Enhanced Linuxまたは略して(SELinux)であり、21年近く前に米国国家安全保障局(NSA)によって開発されました。これは何年も前に導入されましたが、Linuxシステムのセキュリティ対策の1つとして急速かつ広く使用されるようになりました。データベースを使用して構成する方法に関する情報を見つけるのはかなり簡単ではありませんが、MongoDBはこれを利用しています。このブログ投稿では、SELinuxと、MongoDBレプリカセットでSELinuxを構成する方法について説明します。
この目的のために、テスト環境に3つのCentOS 8 VMを使用し、MongoDB4.4を使用します。始める前に、SELinuxについてもう少し詳しく見ていきましょう。
強制、許容、無効モード
これらは、SELinuxがいつでも実行できる3つのモードです。もちろん、それらはすべて、セキュリティポリシーに関して独自の機能と目的を持っています。 1つずつ見ていきます。
施行モードでは、設定されたポリシーがシステムに施行され、ユーザーまたはプロセスの両方による不正アクセスの試みはすべてSELinuxによって拒否されます。それだけでなく、それらのアクセス拒否アクションも関連するログファイルに記録されます。これが最も推奨されるモードですが、現在のほとんどのLinuxシステムでは、SELinux自体の複雑さなどのさまざまな理由により、システム管理者がこのモードを有効にしていません。
Permissiveモードの場合、SELinuxはセミイネーブル状態にあると言っても過言ではありません。このモードでは、SELinuxによってポリシーが適用されることはなく、同時にアクセスが拒否されることもありません。それにもかかわらず、ポリシー違反は引き続き記録され、監査ログに記録されます。通常、このモードは、SELinuxをファイナライズして適用する前に、SELinuxをテストするために使用されます。
無効になっている最後のモードでは、強化されたセキュリティはシステムで実行されていません。システムが現在実行しているSELinuxモードを知っていますか?次のコマンドを実行するだけで、次のように表示されます。
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
テストシステムでは、SELinuxが有効になっており、ガイドの残りの部分に進むことができるように強制として構成されています。システムでSELinuxが無効または許可されている場合は、以下の手順に従って有効にし、強制に変更できます。
-
/ etc / selinux / configファイルを編集して、ディレクティブを強制に変更します
vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…
上記のディレクティブが強制に設定されていることを確認する必要があります。
-
システムを再起動して設定を適用します
$再起動
システムがオンラインになったら、SELinuxが正しく構成され、変更が行われたことを確認する必要があります。次のコマンドを実行して確認します。これは、前に説明した最初のコマンド(sestatus)とは別に確認する別の方法です。
$ getenforce
「強制」という言葉が表示されたら、これで問題がないことを確認できます。レプリカセットを使用するため、すべてのMongoDBノードでSELinuxが構成されていることを確認する必要があります。これは、MongoDB用にSELinuxを構成する前にカバーする必要がある最も重要な部分だと思います。
この例では、MongoDB4.4が3つのノードにインストールされていることを前提としています。インストールは非常にシンプルで簡単です。時間を節約するために、手順は示しませんが、ここにドキュメントへのリンクがあります。
場合によっては、制限のデフォルト値が低いと、システムの「ulimit」によっていくつかの問題が発生します。 MongoDBが正しく実行されるようにするために、ここでMongoDBの推奨事項に従って「ulimit」を設定することを強くお勧めします。すべての展開には固有の要件や設定がある場合がありますが、次の「ulimit」設定に従うのが最善です。
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000
「ulimit」の値を変更するには、次のコマンドを発行します。たとえば、「-n」(ファイルを開く)の値を変更します。
$ ulimit -n 64000
すべての制限が変更されたら、mongodインスタンスを再起動して、新しい制限の変更が確実に行われるようにする必要があります。
$ sudo systemctl restart mongod
MongoDBのドキュメントによると、現在のSELinuxポリシーでは、MongoDBプロセスが/ sys / fs / cgroupにアクセスすることは許可されていません。これは、システムで使用可能なメモリを決定するために必要です。したがって、SELinuxが強制モードになっているこの場合、次の調整を行う必要があります。
cgroupへのアクセスを許可する
最初のステップは、システムに「checkpolicy」パッケージがインストールされていることを確認することです。
$ sudo yum install checkpolicy
yum install checkpolicy
Last metadata expiration check: 2:13:40 ago on Fri 11 Jun 2021 05:32:10 AM UTC.
Package checkpolicy-2.9-1.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
次に、「mongodb_cgroup_memory.te」のカスタムポリシーファイルを作成する必要があります:
cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
type cgroup_t;
type mongod_t;
class dir search;
class file { getattr open read };
}
#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF
ポリシーファイルが作成されたら、最後の手順は、次の3つのコマンドを実行してカスタムポリシーモジュールをコンパイルおよびロードすることです。
$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp
最後のコマンドにはしばらく時間がかかります。完了すると、MongoDBプロセスはSELinux強制モードで正しいファイルにアクセスできるようになります。
FTDCのnetstatへのアクセスを許可する
/ proc / net / netstatは、フルタイム診断データキャプチャ(FTDC)に必要です。要するに、FTDCはMongoDBサーバーの分析を容易にするメカニズムです。 FTDCのデータファイルは圧縮されており、人間が読める形式ではなく、MongoDBデータファイルと同じファイルアクセス許可を継承します。このため、FTDCデータファイルにアクセスできるユーザーのみがデータを送信できます。
構成手順は、前の手順とほぼ同じです。カスタムポリシーが異なるだけです。
$ sudo yum install checkpolicy
Create a custom policy file “mongodb_proc_net.te”:
cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;
require {
type proc_net_t;
type mongod_t;
class file { open read };
}
#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF
最後のステップは、カスタムポリシーをコンパイルしてロードすることです:
$ checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
$ semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
$ sudo semodule -i mongodb_proc_net.pp
注意すべき重要な点の1つは、カスタムディレクトリにMongoDBをインストールした場合は、SELinuxポリシーもカスタマイズする必要があるということです。手順は前の手順とは少し異なりますが、それほど複雑ではありません。
まず、SELinuxポリシーを更新して、mongodサービスが新しいディレクトリを使用できるようにする必要があります。ディレクトリの最後に。*を含める必要があることに注意してください。
$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
-
mongod_var_lib_t for data directory
-
ログファイルディレクトリのmongod_log_t
-
pidファイルディレクトリのmongod_var_run_t
次に、新しいディレクトリのSELinuxユーザーポリシーを更新します。
$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
-
mongod_var_lib_t for data directory
-
ログディレクトリのmongod_log_t
-
pidファイルディレクトリのmongod_var_run_t
最後のステップは、更新されたSELinuxポリシーをディレクトリに適用することです:
restorecon -R -v </some/MongoDB/directory>
MongoDBはデータファイルとログファイルの両方にデフォルトのパスを使用しているため、それを適用する方法について次の例を見ることができます。
/ mongodb / dataのデフォルト以外のMongoDBデータパスの場合:
$ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*'
$ sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data'
$ restorecon -R -v '/mongodb/data'
For non-default MongoDB log directory of /mongodb/log (e.g. if the log file path is /mongodb/log/mongod.log):
$ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*'
$ sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log'
$ restorecon -R -v '/mongodb/log'
状況によっては、MongoDBインストールの一部がデフォルトのポート番号27017以外の異なるポート番号を使用しています。この特定のケースでは、SELinuxも構成する必要があり、コマンドは非常に単純です。 :
$ sudo semanage port -a -t mongod_port_t -p tcp <portnumber>
For example, we are using port 37017:
$ sudo semanage port -a -t mongod_port_t -p tcp 37017
ClusterControlで有効化されたMongoDBSELinuxのデプロイ
ClusterControlを使用すると、MongoDBレプリカセットのデプロイ中にSELinuxを有効にするオプションがあります。ただし、ClusterControlはモードを許可に設定するだけなので、モードを強制に変更する必要があります。デプロイ中に有効にするには、以下のスクリーンショットのように「AppArmor/SELinuxを無効にする」のチェックを外すことができます。
その後、MongoDBレプリカセットのノードを追加して続行できますデプロイを開始します。 ClusterControlでは、MongoDBにバージョン4.2を使用しています。
クラスターの準備ができたら、SELinuxをenforcingに変更する必要がありますすべてのノードを作成し、今実行した手順を参照して構成を進めます。
どのLinuxシステムでもSELinuxには3つのモードがあります。 SELinuxエンフォーシングモードの場合、MongoDBが問題なく実行されるようにするために、従う必要のあるいくつかの手順があります。また、システム要件と仕様に合わせて、一部の「ulimit」設定も変更する必要があることにも注意してください。
ClusterControlを使用すると、デプロイ中にSELinuxを有効にできますが、レプリカセットの準備ができたら、強制モードに変更してポリシーを構成する必要があります。
このブログ投稿が、MongoDBサーバー用のSELinuxのセットアップに役立つことを願っています