データは企業にとって最も重要な資産であるため、データベースでセキュリティに関するすべての考慮事項を考慮して、データを可能な限り安全に保つ必要があります。 RedHatベースのオペレーティングシステムの重要なセキュリティ機能の1つは、SELinuxです。このブログでは、この機能とは何か、PostgreSQLおよびTimescaleDBデータベース用に構成する方法について説明します。
SELinuxとは何ですか?
Security-Enhanced Linux(SELinux)は、管理者がシステムにアクセスできるユーザーをより詳細に制御できるLinuxシステムのセキュリティアーキテクチャです。これは、セキュリティポリシーを使用して、システム上のアプリケーション、プロセス、およびファイルのアクセス制御を定義します。セキュリティポリシーは、SELinuxにアクセスできるものを指示する一連のルールです。
サブジェクトと呼ばれるアプリケーションまたはプロセスがファイルなどのオブジェクトへのアクセスを要求すると、SELinuxはアクセスベクターキャッシュ(AVC)をチェックします。ここで、サブジェクトとオブジェクトのアクセス許可がキャッシュされます。 。 SELinuxがキャッシュされたパーミッションに基づいてアクセスを決定できない場合、SELinuxはリクエストをセキュリティサーバーに送信します。セキュリティサーバーは、アプリまたはプロセスのセキュリティコンテキストとファイルをチェックします。セキュリティコンテキストはSELinuxポリシーデータベースから適用され、アクセス許可が付与または拒否されます。
$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
-
強制(デフォルト):システムでSELinuxセキュリティポリシーを有効にして強制し、不正アクセスの試行を拒否しますユーザーとプロセスによる。
-
許容:これを使用すると、SELinuxが有効になりますが、セキュリティポリシーは適用されません。すべてのポリシー違反は監査ログに記録されます。実施する前にSELinuxをテストするのに良い方法です。
-
無効:SELinuxがオフになっています。
SELINUXTYPEディレクティブは、使用するポリシーを指定します。デフォルト値が対象であり、このポリシーにより、SELinuxではアクセス制御権限をカスタマイズおよび微調整できます。
Enforcingモードがデフォルトのモードである場合でも、SELinuxを無効にすることは、それに対処するよりも簡単であるため、一般的な方法になっています。もちろん、これはお勧めできません。少なくとも許容モードで構成し、ログを定期的にチェックして異常な動作を探す必要があります。
SELinuxがご使用の環境で無効になっている場合は、/ etc / selinux / config構成ファイルを編集し、SELINUX=permissiveまたはSELINUX=enforcingを設定することで有効にできます。
SELinuxを使用したことがない場合、SELinuxを構成する最良の方法は、最初にPermissiveモードを使用し、メッセージログファイルで拒否されたメッセージを探してログをチェックし、必要に応じて修正することです。
$ grep "SELinux" /var/log/messages
すべてが確認され、安全に続行できるようになったら、次のコマンドを使用して、前の方法を使用するか、再起動せずに強制するようにSELinuxを構成できます。
$ setenforce 1
ロールバックする必要がある場合は、次を実行します:
$ setenforce 0
このコマンドを使用して、強制モードと許容モードをオンザフライで切り替えることができますが、システムを再起動しても、これらの変更は持続しません。値を永続化するには、構成ファイルで値を構成する必要があります。
getenforceコマンドを使用して現在のSELinuxステータスを確認できます:
$ getenforce
Enforcing
または、より詳細な情報については、代わりにsestatusを使用できます:
$ 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
PostgreSQLおよびTimescaleDB用にSELinuxを構成する方法
デフォルトの構成とデフォルトのデータディレクトリを使用してPostgreSQL/TimescaleDBをインストールし、SELinuxもデフォルトで構成されている場合、おそらく問題は発生しませんが、問題はたとえば、データベースを保存する特定の場所を使用するので、SELinuxを構成してデータベースを機能させる方法を見てみましょう。この例では、CentOS8にPostgreSQL13をインストールし、データディレクトリとして/ pgsql /data/を使用します。
まず、postgresqlモジュールを有効にします。
$ dnf module enable postgresql:13
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
サービスを有効にする:
$ systemctl enable postgresql.service
PostgreSQLデータベースを初期化します:
$ postgresql-setup --initdb
これで、データディレクトリなど、何も変更せずにサービスを開始すると、正常に開始されます。それ以外の場合は、次のようなエラーが表示されます。
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal postmaster[29116]: postmaster: could not access the server configuration file "/pgsql/data/postgresql.conf": Permission denied
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Failed with result 'exit-code'.
では、修正方法を見てみましょう。まず、PostgreSQL構成ファイルとサービスのデータディレクトリを変更します。このためには、PostgreSQLサービスファイルを編集し、PGDATAの場所を変更します。
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
PostgreSQL bashプロファイルファイルを編集し、PGDATAの場所を変更します:
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
$ systemctl daemon-reload
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
以前に構成ファイルで行ったように、新しいデータディレクトリの場所を指定する必要はありません。ここで、開始する前に、SELinuxラベルを変更する必要があります:
$ chcon -Rt postgresql_db_t /pgsql/data
このコマンドは、SELinuxセキュリティコンテキストを変更します。フラグは次のとおりです。
-
-R、--recursive:ファイルとディレクトリを再帰的に操作します
-
-t、-type =TYPE:ターゲットセキュリティコンテキストでタイプTYPEを設定します
次に、PostgreSQLサービスを開始します:
$ systemctl start postgresql.service
データベースは現在実行中です:
$ ps aux |grep postgres |head -1
postgres 28566 0.0 3.0 497152 25312 ? Ss 21:16 0:00 /usr/bin/postmaster -D /pgsql/data
これは、PostgreSQL/TimescaleDB用にSELinuxを構成する方法の基本的な例にすぎません。さまざまな制限やツールを使用してこれを行うには、さまざまな方法があります。最適なSELinuxの実装または構成は、ビジネス要件によって異なります。
ClusterControlおよびSELinuxでPostgreSQLおよびTimescaleDBを使用する方法
ClusterControlは、SELinuxのようなLinuxカーネルセキュリティモジュールを管理しません。 ClusterControlを使用してPostgreSQLまたはTimescaleDBクラスターをデプロイする場合、エラーのリスクを減らすために、デプロイプロセス中にClusterControlでSELinuxを無効にするかどうかを指定できます。
無効にしたくない場合は、Permissiveを使用できますサーバーのログをモード化して監視し、SELinux構成が正しいことを確認します。その後、上記の手順に従って強制に変更できます。
SELinux構成の詳細については、RedHatまたはCentOSの公式サイトを参照してください。