
私は環境変数について学んでいます。たとえば、秘密のパスワードがある場合は、それをコード内に記述してはいけないことはわかっています。
私が理解したところによると、.envシークレットと環境変数を読み込むには、このファイルを使用する必要があります。
変数を保存するさらに安全な方法は、CLI変数として保存することです。セット指示。
これらすべてを行う理由は、パスワードや機密データが許可されていない人に公開されないようにするためです。
CLI変数としてAPIシークレットを保存したウェブサイトを作成し、ハッカーが私のサーバーにアクセスできたとします。ハッカーは次のコマンドを入力するだけでAPIシークレットとパスワードを簡単に見つけることができます。印刷CLI で。
CLI 変数を .env ファイルに保存するよりも使用することの利点は何ですか? これらの変数が見知らぬユーザーにも表示されないようにするにはどうすればよいでしょうか。
答え1
変数を保存するさらに安全な方法は、set コマンドを使用して CLI 変数として保存することです。
いいえ、違います。まず、そのコマンドは店環境変数はどこにでも永続的に保存できます。そして実際の環境変数に関するもう1つの重要な点は、安全なストレージとは正反対であるということです。その機能はすべてすべてのプロセスすべての環境変数の無料コピーを取得する – たとえば、Windows で変数を永続化するために使用するとsetx
、実行したすべてのアプリまたはツールは、要求されたかどうかに関係なく、その後自動的にコピーを取得します。
ファイルが使用されている場合.env
、通常はWebアプリケーションの環境にのみロードされるか、環境変数としてまったく使用されていません(使い慣れたAPIを模倣しているだけで、実際には変数を単純な辞書/配列にロードしています)。前者の場合、変数はWebアプリケーションによって直接生成されたプログラムで引き続き使用できますが、一度もない通常の SSH CLI で利用できるようになります。ただし、依然として「環境変数」と呼ばれていますが、これは意図された使用法ではありません。
(もちろん、アプリ自体は引き続きそれらにアクセスできます。結局のところ、API を使用するには API キーを知る必要があるため、これは避けられません。推奨されるプログラミング プラクティスに従って、攻撃者がそれを実行する方法を見つける可能性を低くしますprintenv
。たとえば、ファイル名などの外部入力をコマンドに直接入力しないでください。
使用している API によっては、アプリをマイクロサービスのように 2 つに分割して、フロントエンドが API に直接アクセスせず、常に API キーを認識し、フロントエンドに非常に特定のタスクのみを実行できるようにする別のサービス経由にできる場合があります。
答え2
秘密/パスワード/キーの管理は、どれだけの労力を費やすかと、どれだけのリスクがあるかとのバランスを取る複雑なゲームです。ここにいくつか例を挙げます。
- コマンドライン引数で渡されたシークレット: システム上のすべてのユーザーがそれを見ることができます
- text/.envファイルから渡されたシークレット: ファイルの読み取りアクセス権を持つすべてのユーザーがそれを盗むことができます。CLIを使用する場合セットコマンドはデフォルトでコマンド履歴にも表示されます
- 別のサーバーから読み込まれたシークレット: そのサーバーにアクセスするための認証情報はローカルに保存されています
- 秘密はメモリ内にのみ保存されます。ルートアクセス権を持つユーザーは、生のメモリからデータにアクセスしてダンプできます。
誰かがあなたのサーバーを制御している場合、その人はあなたのコードを変更してパスワードを送信することができます (たとえば、クレジットカード情報を盗む一般的な方法です)。
ファイルをスキャンしてパスワードを探すのは非常に簡単なので、プライマリ シークレットをプレーン テキストでローカルに保存することはお勧めしません。それ以外は、あなた次第です。セキュリティを向上させる適切な方法は次のとおりです。
- ローカルシークレットには何らかの暗号化されたキーストアを使用します。実際のパスワードにアクセスするための手順をもう 1 つ追加するだけで、多くの単純な攻撃を阻止できます。
- 外部サーバー/サービスを使用して秘密を保存し、ローカルアクセスのみを持つ人が簡単にすべてを取得できないようにします。