PostgreSQLは、世界で最も安全なデータベースの1つです。データベースのセキュリティは、実際のミッションクリティカルな環境で不可欠な役割を果たします。データベースとデータが常に保護され、不正アクセスにさらされてデータのセキュリティが損なわれないようにすることが重要です。 PostgreSQLは、ユーザーが安全な方法でデータベースにアクセスするためのさまざまなメカニズムと方法を提供しますが、さまざまな外部認証システムと統合して、エンタープライズ標準のデータベースセキュリティ要件を確実に満たすことができます。
SSL、MD5、pgpass、pg_identなどを介して安全な認証メカニズムを提供する以外に、PostgreSQLは他のさまざまな一般的なエンタープライズグレードの外部認証システムと統合できます。このブログでは、SSLとpg_identを使用したLDAP、Kerberos、RADIUSに焦点を当てます。
LDAP
LDAPは、広く使用されている集中認証システムであるライトウェイトディレクトリアクセスプロトコルを指します。これは、ユーザーの資格情報と、名前、ドメイン、ビジネスユニットなど、その他のさまざまなユーザー関連の詳細を表形式の階層形式で格納するデータストアです。ターゲットシステム(データベースなど)に接続するエンドユーザーは、認証を成功させるために、最初にLDAPサーバーに接続する必要があります。 LDAPは、高いセキュリティ標準を要求する組織全体で現在使用されている一般的な認証システムの1つです。
LDAP + PostgreSQL
PostgreSQLはLDAPと統合できます。私の顧客コンサルティングの経験では、これはPostgreSQLの重要な機能の1つと見なされています。ユーザー名とパスワードの認証はLDAPサーバーで行われるため、ユーザーがLDAPを介してデータベースに接続できるようにするには、ユーザーアカウントがデータベースに存在している必要があります。つまり、これは、PostgreSQLに接続しようとするユーザーが、最初にLDAPサーバーにルーティングされ、認証が成功するとPostgresデータベースにルーティングされることを意味します。接続がLDAPサーバーにルーティングされるように、pg_hba.confファイルで構成を行うことができます。以下は、pg_hba.confエントリのサンプルです-
host all pguser 0.0.0.0/0 ldap ldapserver=ldapserver.example.com ldapprefix="cn=" ldapsuffix=", dc=example, dc=com"
以下は、pg_hba.confのLDAPエントリの例です。
host all pguser 0.0.0.0/0 ldap ldapserver=ldapserver.example.com ldapprefix="cn=" ldapsuffix=", ou=finance, dc=example, dc=com"
デフォルト以外のLDAPポートとTLSを使用する場合:
ldap ldapserver=ldapserver.example.com ldaptls=1 ldapport=5128 ldapprefix="uid=" ldapsuffix=",ou=finance,dc=apix,dc=com"
上記のLDAPエントリを理解する
- LDAPは、さまざまな属性と用語を使用して、データストア内のユーザーエントリを格納/検索します。また、前述のように、ユーザーエントリは階層に保存されます。
- 上記のpg_hba.confldapエントリは、CN(共通名)、OU(組織単位)、およびDC(ドメインコンポーネント)と呼ばれる属性で構成されます。これらは相対識別名(RDN)と呼ばれ、これらのRDNのシーケンスは一緒になって何かになります。 DN(識別名)と呼ばれます。 DNはLDAPオブジェクトに基づいており、検索はLDAPデータストアで実行されます。
- CN、DC、OUなどのLDAP属性値は、LDAPのオブジェクトクラスで定義されます。これは、LDAP環境を構築したシステムの専門家が提供できます。
これでLDAPは十分に保護されますか?
そうでないかもしれない。 LDAP環境でネットワークを介して通信されるパスワードは暗号化されていません。これは、暗号化されたパスワードがハッキングされる可能性があるため、セキュリティ上のリスクとなる可能性があります。クレデンシャル通信をより安全にするためのオプションがあります。
- TLS(トランスポート層セキュリティ)でのLDAPの構成を検討してください
- LDAPは別のオプションであるSSLで構成できます
LDAPとPostgreSQLの統合を実現するためのヒント
(Linuxベースのシステムの場合)
- オペレーティングシステムのバージョンに基づいて適切なopenLDAPモジュールをインストールします
- PostgreSQLソフトウェアがLDAPライブラリとともにインストールされていることを確認してください
- LDAPがActiveDirectoryと適切に統合されていることを確認してください
- 使用されているopenLDAPモジュールの既存のBUGをよく理解してください。これは壊滅的であり、セキュリティ基準を損なう可能性があります。
- WindowsActiveDirectoryはLDAPと統合することもできます
- より安全なSSLを使用してLDAPを構成することを検討してください。適切なopenSSLモジュールをインストールし、ネットワークを介して送信されるクレデンシャルを公開する可能性のあるハートブリードなどのバグに注意してください。
Kerberos
Kerberosは、組織で一般的に使用されている業界標準の集中認証システムであり、暗号化ベースの認証メカニズムを提供します。パスワードは、KDC(Key Distribution Centre)と呼ばれるサードパーティの認証サーバーによって認証されます。パスワードはさまざまなアルゴリズムに基づいて暗号化でき、共有秘密鍵を使用してのみ復号化できます。これは、ネットワークを介して通信されるパスワードが暗号化されていることも意味します。
PostgreSQL + Kerberos
PostgreSQLは、Kerberosを使用したGSSAPIベースの認証をサポートしています。 Postgresデータベースに接続しようとするユーザーは、認証のためにKDCサーバーにルーティングされます。クライアントとKDCデータベース間のこの認証は、共有秘密鍵に基づいて実行され、認証が成功すると、クライアントはKerberosベースの資格情報を保持するようになります。同じクレデンシャルがPostgresサーバーとKDCの間で検証され、Kerberosによって生成されたキータブファイルに基づいて検証されます。このキータブファイルは、Postgresプロセスを所有するユーザーに対する適切な権限を持つデータベースサーバーに存在する必要があります。
Kerberosの構成と接続プロセス-
-
Kerberosベースのユーザーアカウントは、「kinit」コマンドを使用してチケット(接続要求)を生成する必要があります。
-
キータブファイルは、完全に修飾されたKerberosベースのユーザーアカウント(プリンシパル)に対して「kadmin」コマンドを使用して生成する必要があります。その後、Postgresは同じキータブファイルを使用して資格情報を検証します。プリンシパルは、「ktadd」コマンドを使用して暗号化して既存のキータブファイルに追加できます。 Kerberos暗号化は、さまざまな業界標準の暗号化アルゴリズムをサポートしています。
生成されたkeytabファイルはPostgresサーバーにコピーする必要があり、Postgresプロセスで読み取り可能である必要があります。以下のpostgresql.confパラメーターを構成する必要があります:
krb_server_keyfile = '/database/postgres/keytab.example.com'
大文字と小文字の区別にこだわる場合は、以下のパラメータを使用してください
krb_caseins_users which is by default “off” (case sensitive)
-
接続がKDCサーバーにルーティングされるようにするには、pg_hba.confにエントリを作成する必要があります
pg_hba.confエントリの例
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.1.6/32 gss include_realm=1 krb_realm=EXAMPLE.COM
マップエントリを含むpg_hba.confエントリの例
# TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.1.6/32 gss include_realm=1 krb_realm=EXAMPLE.COM map=krb
-
接続しようとしているユーザーアカウントは、プリンシパルと呼ばれるKDCデータベースに追加する必要があり、同じユーザーアカウントまたはマッピングユーザーアカウントもデータベースに存在する必要があります
以下はKerberosプリンシパルの例です
pguserはユーザー名であり、「example.com」はKDCサーバーのKerberos構成(/etc/krb5.conf)で構成されたレルム名です。
ケルベロスの世界では、プリンシパル 電子メールのような形式([email protected])であり、データベースユーザーを同じ形式で作成することはできません。これにより、DBAは代わりにデータベースユーザー名のマッピングを作成することを考え、プリンシパルがpg_ident.confを使用してマップされた名前に接続するようにします。
以下は、pg_ident.confのマップ名エントリの例です
# MAPNAME SYSTEM-USERNAME GP-USERNAME mapuser /^(.*)EXAMPLE\.DOMAIN$ admin
これでKerberosは十分に保護されますか?
そうでないかもしれない。ネットワークを介して通信されるユーザーの資格情報は、公開されたり、ハッキングされたりする可能性があります。 Kerberosはプリンシパルを暗号化しますが、それらは盗まれたり、ハッキングされたりする可能性があります。これにより、ネットワーク層のセキュリティを実装する必要が生じます。はい、SSLまたはTLSが最適です。 Kerberos認証システムはSSLまたはTLSと統合できます。 TLSはSSLの後継です。ネットワークを介した通信が保護されるように、KerberosをSSLまたはTLSで構成することをお勧めします。
ヒント
- krb*ライブラリがインストールされていることを確認してください
- SSLを構成するには、OpenSSLライブラリをインストールする必要があります
- Postgresが次のオプションでインストールされていることを確認します
./configure --with-gssapi --with-krb-srvnam --with-openssl
半径
RADIUSは、一元化された
を提供するリモート認証サービスネットワークプロトコルです。認証、許可、およびアカウンティング(AAA)。ユーザー名とパスワードのペアは、RADIUSサーバーで認証されます。この集中認証の方法は、LDAPやKerberosなど、少し複雑な他の認証システムと比較して、はるかに単純で単純です。
RADIUS + PostgreSQL
PostgreSQLはRADIUS認証メカニズムと統合できます。アカウンティングはPostgresではまだサポートされていません。これには、データベースユーザーアカウントがデータベースに存在する必要があります。データベースへの接続は、「radiussecret」と呼ばれる共有シークレットに基づいて許可されます。
pg_hba.conf構成のエントリは、認証のために接続をRADIUSサーバーにルーティングするために不可欠です。
pg_hba.confエントリの例
hostssl all all 0.0.0.0/0 radius radiusserver=127.0.0.1 radiussecret=secretr radiusport=3128
上記のエントリを理解するには-
「radiusserver」は、ユーザーが認証のためにルーティングされるRADIUSサーバーのホストIPアドレスです。このパラメータは、RADIUSサーバーの/etc/radiusd.confで設定されます。
「radiussecret」値はclients.confから抽出されます。これは、radiusクライアント接続を一意に識別する秘密のコードです。
「radiusport」は/etc/radiusd.confファイルにあります。これは、radius接続がリッスンするポートです。
SSLの重要性
SSL(Secure Socket Layer)は、外部認証システムが導入されている場合に不可欠な役割を果たします。ネットワークを介してクライアントとサーバー間で機密情報が通信され、SSLによってセキュリティがさらに強化されるため、外部認証システムを使用してSSLを構成することを強くお勧めします。
外部認証システムを使用した場合のパフォーマンスへの影響
効果的で効率的なセキュリティシステムは、パフォーマンスを犠牲にしてもたらされます。データベースに接続しようとしているクライアント/ユーザーは、接続を確立するために認証システムにルーティングされるため、パフォーマンスが低下する可能性があります。パフォーマンスのハードルを克服する方法があります。
- 外部認証メカニズムが導入されていると、データベースへの接続を確立するときに遅延が発生する可能性があります。データベースへの接続が大量に確立されている場合、これは実際の懸念事項になる可能性があります。
- 開発者は、データベースに対して不必要に多数の接続が行われないようにする必要があります。 1つの接続を介して提供される複数のアプリケーション要求が有利です。
- また、データベース側で各リクエストにかかる時間も重要な役割を果たします。リクエストの完了に時間がかかる場合、後続のリクエストはキューに入れられます。プロセスのパフォーマンス調整とインフラストラクチャの綿密な設計が重要になります!
- 優れたパフォーマンスを確保するには、データベースとインフラストラクチャを効率的に設計し、十分な容量を確保する必要があります。
- パフォーマンスベンチマークを実行するときは、SSLが有効になっていることを確認してから、平均接続確立時間を評価する必要があります。
外部認証システムとClusterControlの統合-PostgreSQL
PostgreSQLインスタンスは、ClusterControlGUIを介して自動的に構築および構成できます。 ClusterControlを介してデプロイされたPostgreSQLインスタンスと外部認証システムを統合することは、従来のPostgreSQLインスタンスとの統合と比較して非常によく似ており、実際には少し簡単です。以下は同じものの概要です-
- ClusterControlは、LDAP、KRB、GSSAPI、およびOpenSSL機能が有効になっているPostgreSQLライブラリをインストールします
- 外部認証システムとの統合には、ClusterControlGUIを使用して実行できるpostgresqlデータベースサーバーでのさまざまなパラメーター構成の変更が必要です。