シェルスクリプトでパスワードを隠す

シェルスクリプトでパスワードを隠す

シェルスクリプトでパスワードを隠す方法は?データベースにアクセスするスクリプトがたくさんあります。スクリプトを開くと、他の人もユーザー名とパスワードを知ります。だから隠す方法を知っている人がいれば教えてください。

方法があります。ファイルにパスワードを入力してファイルを非表示にすると、誰もファイルにアクセスできなくなります(データベースにアクセスするときに権限を変更し、スクリプトでファイルを使用します)。

ベストアンサー1

最初複数の人がすでに述べたように、資格情報をスクリプトから分離することが重要です。 (セキュリティの強化に加えて、これは異なる資格情報を使用して複数のシステムで同じスクリプトを再利用できることを意味します。)

第二、資格情報のセキュリティだけでなく、その資格情報が破損した場合の影響も考慮する必要があります。データベースへのすべてのアクセスには1つのパスワードしか使用しないでください。アクセスレベルの異なるさまざまな資格情報を使用する必要があります。たとえば、データベースで検索を実行できるデータベースユーザーがあるとします。このユーザーは読み取り専用アクセス権を持っている必要があります。他のユーザーには新しいレコードを挿入する権限がありますが、削除することはできません。第三者がその記録を削除する権利を有することもあります。

各アカウントの権限を制限するだけでなく、各アカウントの使用範囲も制限する必要があります。たとえば、Webサーバーで使用するアカウントは、Webサーバー以外のIPアドレスから接続することを許可してはいけません。データベースへのフルrootアクセス権を持つアカウントは、実際に接続できる場所を非常に制限する必要があり、対話型以外は絶対に使用しないでください。また、各アカウントが実行できる操作を正確に制限するには、データベースでストアドプロシージャを使用することをお勧めします。

この制限は、クライアントが破損しても変更できないようにシステムのデータベースサーバー側に適用する必要があります。 (もちろん、データベース構成に加えて、データベースサーバーもファイアウォールなどで保護する必要があります...)

データベースアカウントが制限された読み取り専用アクセスのみを許可し、特定のIPアドレスからのみアクセスできる場合、データの機密性とFleeedスクリプトホストのセキュリティによっては、それ以上の資格情報が不要になる可能性があります。 Webページに表示される情報のみを抽出するストアドプロシージャのみを使用できるユーザーが実行できるWebサイトの検索フォームの例があります。この場合、情報が既に公開されており、ユーザーがより機密性の高い他のデータにアクセスできないため、パスワードを追加しても実際にセキュリティが強化されることはありません。

また、TLSを使用してデータベースへの接続を確立する必要があります。そうしないと、ネットワークから受信したすべての人があなたの資格情報を取得できます。

第三、使用する資格情報を検討してください。パスワードは単なる形式であり、最も安全なものではありません。代わりに、公開/秘密鍵ペアやAD/PAMなどを使用できます。

第四、スクリプトが実行される条件を考慮してください。

対話的に実行している場合は、実行時にパスワードまたは秘密鍵のパスワードを入力するか、有効なKerberosチケットでログインする必要があります。つまり、スクリプトは実行時に取得する値を選択する必要があります。資格情報をファイルから読み取るのではなく、ユーザーが直接提供します。

Webサーバーで実行している場合は、Webサーバーを起動するときに資格情報の設定を検討してください。 SSL証明書は良い例です。公開証明書と秘密鍵があり、秘密鍵にはパスワードがあります。 Webサーバーに秘密鍵を保存できますが、Apacheを起動するときにパスワードを入力する必要があります。サーバーが起動すると、削除またはロックできるハードウェアの種類(物理カードやHSMなど)の資格情報を持つこともできます。 (もちろん、このアプローチの欠点は、問題が発生した場合、サーバーがそれ自体で再起動できないことです。

スクリプトがcronで実行されている場合、これは難しい部分です。他の人がアクセスできるシステムのどこかに資格情報を配置したくありませんが、スクリプトがアクセスできるように資格情報を囲むことを望んでいます。そうですか?まあ、まったく正しいではありません。スクリプトが実行する作業について慎重に考えてください。データベースに対してどのような権限が必要ですか?間違った人がこれらの権限で接続しても問題にならないように制限できますか?他のユーザーがいるサーバーでスクリプトを実行するのではなく、他のユーザーがアクセスできないデータベースサーバーでスクリプトを直接実行できますか?何らかの理由で私が考えることができない場合、あなたは絶対に〜しなければならない安全でないサーバーでスクリプトを実行すると、〜しなければならない危険で破壊的なことをすることができるということ…今、アーキテクチャを考え直すのに良い時間です。

データベースのセキュリティを重視している場合は、他の人がアクセスできるサーバーでこれらのスクリプトを実行しないでください。誰かがあなたのシステムにログインすると、〜する資格を取得する機会があります。たとえば、SSL証明書を持つWebサーバーを使用すると、誰かがroot権限を取得してhttpdプロセスのメモリ領域にアクセスして資格情報を抽出できることが理論的に可能です。最近、攻撃者がログインせずにSSLを利用してこれを行う脆弱性が1つ以上ありました。

また、SELinux、AppArmor、またはシステムで利用可能なすべてを使用して、ユーザーができることを制限することを検討してください。これにより、ユーザーが資格情報にアクセスできたとしても、データベースに接続しようとすることを禁止できます。

これらすべてがあなたにとても負担になるなら、そしてそれを行う余裕がないか、そうする時間がありません。それから私の(傲慢でエリート主義的な)意見では、重要なまたは敏感な内容をデータベースに保存してはいけません。重要または機密性の高いコンテンツを保存しない場合、資格情報をどこに保存するかは重要ではありません。では、なぜパスワードを使用するのですか?

ついに、何らかの資格情報を保存することを避けることができない場合は、資格情報を読み取り専用にし、rootが所有するようにすることができ、rootはスクリプトが要求したときに一時的に所有権を付与することができます。いいえルートとして実行し、必ずしも必要でない限り、データベースに接続する必要はありません。しかし、まだ良い考えではありません。

おすすめ記事