sql >> データベース >  >> RDS >> Database

データベースは保護されていますか?もう一度考えて

    1。サーバーを保護する

    多くの既知の攻撃は、マシンに物理的にアクセスした場合にのみ発生する可能性があります。このため、アプリケーションサーバーとデータベースサーバーを別々のマシンに配置することをお勧めします。これが不可能な場合は、細心の注意を払う必要があります。そうしないと、アプリケーションサーバーを介してリモートコマンドを実行することにより、攻撃者が権限がなくてもデータベースに損害を与える可能性があります。このため、データベースと同じマシンで実行されているサービスには、サービスの動作を許可する最小限の権限を付与する必要があります。


    セキュリティパッケージ全体(ウイルス対策とスパム対策、ファイアウォール、およびオペレーティングシステムのベンダーが推奨するすべてのセキュリティパッケージ)をインストールすることを忘れないでください。また、サーバーの物理的な場所を10分間考えることを忘れないでください。間違った場所では、サーバーが盗まれたり、浸水したり、野生動物や浮浪者に危害を加えられたりする可能性があります。

    2。ローカルホストのセキュリティまたはリモートアクセスを無効化または制限する

    MySQLがシステムから取得されるのか、それとも独自のサーバーから直接アクセスされるのかを検討してください。リモートアクセスが利用される可能性が低い場合は、特性化されたホストだけがサーバーにアクセスできることを保証します。これは通常、TCPラッパー、IPテーブル、またはその他のファイアウォールプログラミングやハードウェアアクセシビリティツールを介して行われます。
    MySQLがネットワークソケットを開かないように制限するには、付随するパラメータをmy.cnfまたはmy.iniの[mysqld]領域に含める必要があります。

    スキップネットワーキング

    ドキュメントは"C:\ Program Files \ MySQL \ MySQL Server 5.1"にあります。 Windowsオペレーティングシステムのカタログまたは"/etc / my.cnf" または"/etc / mysql / my.cnf" Linuxの場合。
    この行は、MySQLの起動中にシステム管理の開始を不自由にします。ローカル接続を使用してMySQLサーバーへの接続を設定できることを念頭に置いておくと理想的です。

    別の可能な解決策は、 [mysqld] に次の行を追加して、MySQLにローカルホストのみをリッスンさせることです。 my.cnfのセクション bind-address =127.0.0.1
    組織内のクライアントが自分のマシンまたは代替マシンに導入されたWebサーバーからサーバーとインターフェイスする場合、データベースサーバーへのシステムアクセスを無効にすることをいとわない場合があります。その場合、次の制限付き付与構文を検討する必要があります。

    mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';  

    3。 LOCALINFILEの使用を無効にする

    次の変更は、 "LOAD DATA LOCAL INFILE"の使用を無効にすることです。 コマンド。これは、近所の記録からの未承認の閲覧を防ぐのに役立ちます。これは、PHPアプリケーションに新しいSQLインジェクションの脆弱性が見つかった場合に特に重要です。
    さらに、場合によっては、 "LOCAL INFILE" コマンドを使用して、オペレーティングシステム上の他のファイル( "/ etc / passwd" など)にアクセスできます。 、次のコマンドを使用します:

    mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

    または、それほど難しくありません:

    mysql> SELECT load\_file("/etc/passwd")

    "LOCAL INFILE"の使用を無効にするには コマンドの場合、次のパラメータを [mysqld]に追加する必要があります MySQL構成ファイルのセクション。

    set-variable=local-infile=0

    4。ルートのユーザー名とパスワードを変更し、強力に保ちます。

    MySQLサーバーのデフォルトの管理者ユーザー名は"root" 。ハッカーは、その権限にアクセスしようとすることがよくあります。このタスクを難しくするには、名前を "root"に変更します。 他の何かに追加し、長くて複雑な英数字のパスワードを提供します。

    管理者のユーザー名の名前を変更するには、MySQLコンソールでrenameコマンドを使用します。

    mysql> RENAME USER root TO new\_user;

    MySQL "RENAME USER" コマンドはMySQLバージョン5.0.2で最初に登場しました。古いバージョンのMySQLを使用している場合は、他のコマンドを使用してユーザーの名前を変更できます。

    mysql> use mysql;
    
    mysql> update user set user="new\_user" where user="root";
    
    mysql> flush privileges;

    ユーザーのパスワードを変更するには、次のコマンドラインコマンドを使用します。

    mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');

    "mysqladmin"を使用してパスワードを変更することもできます。 ユーティリティ:

    shell> mysqladmin -u username -p password newpass

    5。 「テスト」データベースを削除します

    MySQLには、テストスペースとして使用される「テスト」データベースが付属しています。匿名ユーザーがアクセスできるため、多数の攻撃で使用されます。
    このデータベースを削除するには、次のようにdropコマンドを使用します。

    mysql> drop database test;  

    または、 "mysqladmin"を使用します コマンド:

    shell> mysqladmin -u username -p drop test  

    6。匿名で古いアカウントを削除する

    MySQLデータベースには、パスワードが空白の匿名ユーザーが含まれています。その結果、誰でもデータベースに接続して、これが当てはまるかどうかを確認できます。次の手順を実行します。

    mysql> select \* from mysql.user where user="";  

    安全なシステムでは、回線がエコーバックされないようにする必要があります。同じことを行う別の方法:

    mysql> SHOW GRANTS FOR ''@'localhost';
    
    mysql> SHOW GRANTS FOR ''@'myhost';

    助成金が存在する場合、誰でもデータベースにアクセスでき、少なくともデフォルトのデータベースを使用できます "test" 。これを確認してください:

    shell> mysql -u blablabla

    アカウントを削除するには、次のコマンドを実行します。

    mysql> DROP USER "";

    MySQL "DROP USER" コマンドは、MySQLバージョン5.0以降でサポートされています。古いバージョンのMySQLを使用している場合は、次のようにアカウントを削除できます。

    mysql> use mysql;
    
    mysql> DELETE FROM user WHERE user="";
    
    mysql> flush privileges;  

    7。ロールベースのアクセス制御でセキュリティを強化

    非常に一般的なデータベースセキュリティの推奨事項は、さまざまな関係者に与えられる権限を下げることです。 MySQLも例外ではありません。通常、開発者が作業するときは、システムの最大のアクセス許可を使用し、アクセス許可の原則を私たちが予想するよりも考慮しません。この方法では、データベースが重大なリスクにさらされる可能性があります。
    *正しいセキュリティ対策を使用してすでにインストールされているMySQL5.xの新しいインストール。
    データベースを保護するには、MySQLデータベースが実際に保存されているファイルディレクトリが、ユーザー「mysql」とグループ「mysql」によって所有されていることを確認してください。

    shell>ls -l /var/lib/mysql

    さらに、ユーザー「mysql」と「root」のみがディレクトリ/var/lib/mysqlにアクセスできることを確認してください。 。
    / usr / bin /ディレクトリの下にあるmysqlバイナリは、「root」または特定のシステム「mysql」ユーザーが所有する必要があります。他のユーザーは、これらのファイルへの書き込みアクセス権を持ってはなりません。

    shell>ls -l /usr/bin/my\*  

    8。データベースの権限を確認してください

    オペレーティングシステムのアクセス許可は、前のセクションで修正されました。次に、データベースのアクセス許可について説明します。ほとんどの場合、データベースに共存する管理者ユーザー(名前は「root」)と1人以上の実際のユーザーがいます。通常、「ルート」はデータベース内のデータとは何の関係もありません。代わりに、サーバーとそのテーブルの保守、アクセス許可の付与と取り消しなどに使用されます。
    一方、「select \ update \ insert \ delete」クエリを実行したり、ストアドプロシージャを実行したりするために、Webサーバーに割り当てられたユーザーIDなど、一部のユーザーIDはデータへのアクセスに使用されます。ほとんどの場合、他のユーザーは必要ありません。ただし、システム管理者であるあなただけが、アプリケーションのニーズを実際に知ることができます。

    管理者アカウントにのみ、SUPER / PROCESS/FILE権限とmysqlデータベースへのアクセス権を付与する必要があります。通常、データにアクセスするための管理者の権限を下げることをお勧めします。

    残りのユーザーの権限を確認し、これらが適切に設定されていることを確認します。これは、次の手順を使用して実行できます。

    mysql> use mysql;  

    [ユーザーを特定する]

    mysql> select \* from users;  

    [すべてのユーザーの付与を一覧表示]

    mysql> show grants for ‘root’@’localhost’;

    上記のステートメントは、ユーザーごとに実行する必要があります。ルート権限を本当に必要とするユーザーのみに権限を付与する必要があることに注意してください。

    もう1つの興味深い特権は、「SHOWDATABASES」です。デフォルトでは、このコマンドはMySQLプロンプトにアクセスできるすべての人が使用できます。彼らはそれを使用して、たとえばデータを盗むことによってデータベースを攻撃する前に、情報を収集する(たとえば、データベース名を取得する)ことができます。これを防ぐには、以下の手順に従うことをお勧めします。

    • MySQLの起動スクリプトに「--skip-show-database」を追加するか、MySQL構成ファイルに追加します
    • このコマンドを使用するユーザーにのみSHOWDATABASES特権を付与します

    「SHOWDATABASES」コマンドの使用を無効にするには、/etc/my.cnfの[mysqld]セクションに次のパラメーターを追加する必要があります。 :

    [mysqld]

    skip-show-database  

    9。ロギングを有効にする

    データベースサーバーが多くのクエリを実行しない場合は、/etc/my.cnfの[mysqld]セクションに次の行を追加して、トランザクションログを有効にすることをお勧めします。 ファイル:

    [mysqld]

    log =/var/log/mylogfile  

    これは、サーバーのオーバーヘッドが高くなるため、本番環境のMySQLサーバーにはお勧めしません。
    さらに、「root」と「mysql」のIDのみがこれらのログファイルにアクセスできることを確認します(少なくとも書き込みアクセス)。

    エラーログ 「root」と「mysql」のみがログファイル「hostname.err」にアクセスできることを確認してください。ファイルはmysqlデータディレクトリに保存されます。このファイルには、パスワード、アドレス、テーブル名、ストアドプロシージャ名、コード部分などの非常に機密性の高い情報が含まれています。情報収集に使用でき、場合によっては、データベース、データベースがインストールされているマシン、またはデータベース内のデータを悪用するために必要な情報を攻撃者に提供する可能性があります。

    MySQLログ 「root」と「mysql」のみがログファイル「logfileXY」にアクセスできることを確認してください。ファイルはmysqlデータディレクトリに保存されます。

    10。ルートディレクトリを変更する

    UNIX {オペレーティングシステム}オペレーティングシステムのchrootは、現在実行中のメソッドとその子の見かけのディスクルートディレクトリを変更する操作です。別のディレクトリに再ルートされたプログラムは、そのディレクトリ外のファイルにアクセスしたり名前を付けたりすることはできません。そのため、ディレクトリの名前は「chrootjail」または(あまり一般的ではありませんが)「chrootprison」です。

    chroot環境を使用することで、mySQLプロセス(および子プロセス)の書き込みアクセスを制限して、サーバーのセキュリティを強化できます。

    chrootされた環境専用のディレクトリが存在することを確認してください。これは次のようになります:/chroot/mysql さらに、データベース管理ツールを便利に使用するには、MySQL構成ファイルの[client]セクションで次のパラメーターを変更する必要があります。

    [クライアント]

    socket = /chroot/mysql/tmp/mysql.sock

    そのコード行のおかげで、mysql、mysqladmin、mysqldumpなどのコマンドに--socket=/chroot/mysql/tmp/mysql.sockを指定する必要はありません。 これらのツールを実行するたびにパラメータを設定します。

    11。古いログを定期的に削除する

    インストール手順の間、歓迎されないユーザーがデータベースを攻撃するのを助ける多くの機密データがあります。このデータはサーバーの履歴内に保持されており、インストール中に1つの問題が発生した場合に非常に役立つ可能性があります。管理者は、履歴ファイルを分析することで、何が問題になっているのかを把握し、おそらく問題を修正できます。ただし、インストールの完了後は、これらのファイルは必要ありません。
    MySQL履歴ファイル(〜/ .mysql_history)の内容を、すべての無効なSQLコマンドが保持されている場所(特に、プレーンテキストとして保持されているパスワード)から削除する必要があります。

    cat /dev/null > ~/.mysql\_history

    結論として、データベースのセキュリティに重点を置く必要があります。ただし、それは個人または企業にとって最初のものでなければなりません。


    1. Railsモデルへの外部キーの追加

    2. pdomysqlトランザクションを理解する

    3. 最初の列の値が同じ場合は、2番目の列の値を連結します

    4. OBJECTPROPERTY()を使用して、オブジェクトがSQLServerのビューであるかどうかを判断します