DBMS-データセキュリティ

新しいプロジェクトの実装中に、顧客は実装されたDBMSがどのように保護されるのかという質問をよくします。 考えられる答えの1つ(私の意見では間違っています):「データベースはコンピューターネットワークの内部境界にあり、攻撃者はアクセスできません。」 統計によると、インサイダーは提供されるサービスの脆弱性を合法的に調査する機会があるため、より危険です。



システムのセキュリティレベルを上げることができる既存の機能を個別に設定することをお勧めします。



序文:PostgreSQLの設定を確認するユーティリティを作成するタスクを割り当てられました。 この記事では、不正アクセスを防ぐために使用されるこのデータベース管理システムの機能の分析を共有したいと思います。



1.ソフトウェアの更新。



インターネットコミュニティで発見された脆弱性を解決するために、最新バージョンのソフトウェアまたは特別なパッチをインストールする必要があります 。 執筆時点では、これは9.5.4です。 次に、PGDATAディレクトリのpostgresql.confファイルのパラメーターを変更します。これらのパラメーターはすべて、DBMSサービスの再起動を必要とするためです。



2.カスタム設定の設定



接続ポートを変更します。



port = '5333'
      
      





もちろん、nmapはpostgresサービスを検出しますが、ターゲットホストを特定するよりもネットワーク上のアクティブスキャンを検出する方が簡単です。 必要に応じて、 ポートノッキングを使用できます。



3.可能な接続の数を制限する



IPユーザーを明示的に指定します。 ユーザーにはSQLクエリを記述するアクセス権が与えられないことが多いため、生産的なサーバーの数を制限しています。



 listen_addresses = 'ip_1, ip_2, ip_3'
      
      





同時接続の最大数を変更します(スーパーユーザーまたはレプリケーションの場合は+1)。 デフォルト値は100(明らかにWebサーバーでの作業に基づいています)ですが、1Cプールの標準バンドルがある場合は、以下をインストールします。



 max_connections = '4'
      
      





pg_hba.confファイルでhosthostnossl、およびlocal エントリ (Unixドメインソケットが使用されていない場合は後者を削除しますhostsslのみをインストールします。



標準のpostgresアカウントとすべてのパラメーターを削除します。DATABASEには特定のデータベース名を指定し、USERには接続を許可されたユーザーの名前を指定します。



METHODフィールドに、ユーザー認証のタイプと追加オプションを入力します。 この例では、SSL証明書を使用してユーザーの有効性を確認します。つまり、 certパラメーターを追加します。 次の形式の行を取得します。



 hostssl test_database test_user 192.168.23.2/24 cert
      
      





一般に、postgresはGSS、SSPI、IDENT、LDAP、RADIUS、およびPAMとの互換性を実装しているため、想像力には多くの自由があります。



4.パスワード選択の複雑さ。



DBMSへの認証の時間を制限します。



 authentication_timeout = '1s'
      
      





人々の直接アクセスが使用されない場合、値を「1s」に設定します-ロボットが正しいパスワード情報を入力するのに十分ですが、完全な総当たり攻撃には十分ではありません。 MD5でPostgreSQLユーザーパスワードを非表示にします。



 password_encryption = 'on'
      
      





接続が成功した場合、DBMSはデータベースへのユーザーアクセスを確認する必要があります。 この設定を有効にすると、ユーザーは<username> @ <db_work_name>の形式で作成する必要があります。



 db_user_namespace = 'on'
      
      





GSSAPI認証を使用する場合-インストール:



 krb_server_keyfile = '_c' krb_caseins_users = 'on'
      
      





注:名前では大文字と小文字が区別されます。 この設定を使用する場合、ユーザーは<ユーザー名> @ <ドメイン名>の形式で名前を作成する必要があります。 したがって、 db_user_namespaceオフに切り替える必要があります。



5.アーキテクチャー機能の使用



レプリケーションを使用する場合、パラメーターmax_wal_senders = 2およびmax_replication_slots = 2を使用してレプリカントの数を制限できます。 潜在的な攻撃者は、たとえデータベースにアクセスできたとしても、レプリカが動作状態にある限り、バックアップされたすべてのデータをすぐにダウンロードすることはできません。



PostgresのデフォルトのREPEATABLE READ分離レベルはISO / IEC 9075が必要とするよりも厳しいですが、同じSQL標準では次の使用を推奨しています:



 default_transaction_isolation = 'serializable'
      
      





default_transaction_read_only = onを設定してから、セッション内のトランザクションのレベルの変更をトリガーするトリガーを作成できます。 したがって、DBMSに加えられた変更のログを保持できます。



6.データチャネル暗号化



SSLをオンにします-PostgreSQLとクライアント間の効率を保護します。



 ssl = 'on' ssl_ciphers = 'HIGH:+3DES:!aNULL'
      
      





!ANULLパラメーターは、匿名ユーザーの入力を禁止します。 念のため、セキュアな接続を確立するときにサーバーがそのルールを決定することを明示的に示します(デフォルトでは機能します)。



 ssl_prefer_server_ciphers = 'on'
      
      





SSLの証明書を生成します- この指示に従って可能です。 Postgresでは、発行された証明書の名前と接続を行うユーザーの名前のIDが必要であると考えています。 Windowsを使用している場合、OpenSSLを配置して同じコマンドを実行できます。 デフォルトの証明書はPGDATAに含まれている必要があります。





postgresqlサービスを再起動し、エラーを確認します。 ユーザー側では、証明書のチェーンを確立します。 次のパラメーターを指定したpsqlユーティリティを使用して、接続を確認できます。



 psql -U test_user sslcert=test_user.crt
      
      





接続が成功した場合の結論:



 SSL- (: TLSv1.2, : ECDHE-RSA-AES256-GCM-SHA384, : 256)
      
      





あとがき:バージョン9.5以降、 文字列セキュリティポリシーが追加されました。 彼女とデータベースでのネイティブデータ暗号化の使用については、別のテキストを書くことができると思います。



All Articles