GNU/Linux >> Linux の 問題 >  >> Linux

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

シェルスクリプトでパスワードを非表示にするにはどうすればよいですか?データベースにアクセスしているスクリプトは多数あります。スクリプトを開くと、他の人もユーザー名とパスワードを認識しています。ですから、誰かが隠す方法を知っているなら、私に知らせてください。

私には1つの方法があります。ファイルにパスワードを配置し、ファイルを非表示にして、誰もファイルにアクセスしないようにします(データベースにアクセスするときに、アクセス許可を変更し、スクリプトでファイルを使用します)。

承認された回答:

最初 、すでに何人かの人が言っているように、クレデンシャルをスクリプトから分離しておくことが不可欠です。 (セキュリティの強化に加えて、異なる資格情報を持つ複数のシステムで同じスクリプトを再利用できることも意味します。)

2番目 、クレデンシャルのセキュリティだけでなく、それらのクレデンシャルが侵害された場合の影響も考慮する必要があります。データベースへのすべてのアクセスに対して1つのパスワードだけを使用するのではなく、アクセスレベルが異なるさまざまな資格情報を使用する必要があります。たとえば、データベースで検索を実行できるDBユーザーを1人持つことができます。そのユーザーには、読み取り専用アクセス権が必要です。別のユーザーは、新しいレコードを挿入する権限を持っている可能性がありますが、それらを削除することはできません。 3つ目は、レコードを削除する権限を持っている可能性があります。

各アカウントのアクセス許可を制限することに加えて、各アカウントを使用できる場所にも制限を設ける必要があります。たとえば、Webサーバーが使用するアカウントは、WebサーバーのIPアドレス以外のIPアドレスからの接続を許可しないでください。データベースへの完全なルート権限を持つアカウントは、接続元の場所に関して実際に非常に制限する必要があり、対話型以外で使用しないでください。また、データベース内のストアドプロシージャを使用して、各アカウントで実行できることを正確に制限することを検討してください。

これらの制限は、システムのDBサーバー側で実装する必要があります。これにより、クライアント側が危険にさらされた場合でも、制限を変更することはできません。 (そして、明らかに、DBサーバーはDB構成に加えてファイアウォールなどで保護する必要があります…)

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

また、データベースへの接続がTLSを使用して行われていることを確認してください。そうしないと、ネットワークでリッスンしている人があなたの資格情報を取得できます。

3番目 、使用する資格情報の種類を検討してください。パスワードは1つの形式にすぎず、最も安全ではありません。代わりに、何らかの形式の公開鍵と秘密鍵のペア、またはAD/PAMなどを使用できます。

4番目 、スクリプトが実行される条件を考慮してください:

関連:netstatのソースコード?

インタラクティブに実行する場合は、パスワード、秘密鍵のパスワード、または秘密鍵を入力するか、有効なKerberosチケットを使用してログインする必要があります。つまり、スクリプトはクレデンシャルは、ファイルから読み取るのではなく、実行時に直接ユーザーから送信されます。

Webサーバーから実行する場合は、Webサーバーの起動時に資格情報を設定することを検討してください。ここでの良い例はSSL証明書です。SSL証明書には公開証明書と秘密鍵があり、秘密鍵にはパスワードがあります。秘密鍵はWebサーバーに保存できますが、Apacheを起動するときにパスワードを入力する必要があります。また、物理カードやHSMなどのある種のハードウェアにクレデンシャルを設定して、サーバーの起動後に削除またはロックすることもできます。 (もちろん、この方法の欠点は、何かが起こった場合にサーバーが自動的に再起動できないことです。システムが危険にさらされるリスクよりもこれを優先しますが、マイレージは異なる場合があります…)

スクリプトがcronから実行されている場合、これは難しい部分です。誰かがアクセスできるシステム上のどこにでもクレデンシャルを配置したくないのですが、スクリプトがアクセスできるように、クレデンシャルを配置したいのですよね?まあ、完全に正しくありません。スクリプトが何をしているのかを正確に考慮してください。データベースにはどのような権限が必要ですか?間違った人がそれらの権限に接続しても問題にならないように制限できますか?代わりに、他のユーザーがいるサーバーからではなく、他の誰もアクセスできないDBサーバーでスクリプトを直接実行できますか?なんらかの理由で私が思いつかない場合は、絶対に必要 安全でないサーバーでスクリプトを実行し、必須 危険で破壊的なことをすることができます…今があなたのアーキテクチャを再考する良い機会です。

5番目 、データベースのセキュリティを重視する場合は、他の人がアクセスできるサーバーでこれらのスクリプトを実行しないでください。誰かがあなたのシステムにログインしている場合、その人はします あなたの資格を取得する可能性があります。たとえば、SSL証明書を使用するWebサーバーの場合、少なくとも理論的には、誰かがルートを取得してhttpdプロセスのメモリ領域にアクセスし、資格情報を抽出できる可能性があります。最近、SSLを介してこれを実行でき、攻撃者がログインする必要さえないエクスプロイトが少なくとも1つあります。

また、SELinuxやAppArmorなど、システムで利用可能なものを使用して、どのユーザーが何を実行できるかを制限することを検討してください。クレデンシャルにアクセスできたとしても、ユーザーがデータベースに接続しようとすることを禁止することができます。

これがすべてあなたにとってやり過ぎのように聞こえる場合 、そしてそれを行う余裕がないか、時間がない–それなら、私の(傲慢でエリート主義の)意見では、重要なものや機密性の高いものをデータベースに保存するべきではありません。また、重要なものや機密性の高いものを保存していない場合は、資格情報をどこに保存するかも重要ではありません。その場合、なぜパスワードを使用するのでしょうか。

関連:XKCDのようなパスワードのリストから4つのランダムな単語を生成しますか?

最後に 、ある種のクレデンシャルの保存を絶対に避けられない場合は、クレデンシャルを読み取り専用にし、rootが所有するようにすることができます。また、スクリプトによって要求された場合、rootは非常に一時的に所有権を付与できます(スクリプトはない どうしても必要な場合を除いてrootとして実行し、データベースに接続しても必要ありません)。しかし、それでも良い考えではありません。


Linux
  1. シェルスクリプト内から passwd コマンドを使用する

  2. シェルスクリプトの現在のディレクトリ?

  3. シェルスクリプトでユーザーのパスワードを確認する

  1. シェルスクリプトでSetuidを許可しますか?

  2. 実行時にスクリプトでシェルを決定しますか?

  3. インタラクティブシェルのセッションのプロセスとスクリプトのプロセス?

  1. $の意味は?シェルスクリプトでは?

  2. シェルからPythonスクリプトを実行する方法

  3. シェル スクリプトとはシェル スクリプトの作成方法