危険な直書き卒業!
バッチやプログラムに秘密情報を書かない
安全な設計ガイド

「バッチファイルやPythonコードにパスワードやトークンを書きたくない」をテーマに、 現場でよく使う4つのパターンを、手順ベースでまとめた記事です。

  • 対象OS:Windows
  • 想定言語:バッチ(.bat)、Python
  • 想定用途:APIキー、DB接続情報、ログインID/パスワードなどの秘匿情報

4つのパターン

  1. Windowsの環境変数に逃がす
  2. .envファイル+python-dotenvで管理する
  3. Windows資格情報マネージャー+Python(keyring)で暗号化保存
  4. GitHub ActionsのSecretsでクラウド側に隠す

最後に、「バッチには何も書かず、Python側で全部読む」構成例も載せます。

Windowsの環境変数に逃がす

1. システム環境変数に登録する手順(GUI)

  1. スタートメニューで「環境変数」と検索
  2. システム環境変数の編集」を開く
  3. 環境変数(N)...」ボタンをクリック
  4. 「ユーザー環境変数」または「システム環境変数」で「新規(N)...」
  5. 例えば以下のように登録
    • 変数名APP_USERNAME
    • 変数値example_user
    • 変数名APP_PASSWORD
    • 変数値example_password
  6. OKで閉じて、新しいコマンドプロンプトを開き直す

2. バッチファイルから参照する

Bash
@echo off

echo ユーザー名: %APP_USERNAME%
echo パスワード: %APP_PASSWORD%

python main.py

3. Pythonから参照する

Python
import os

username = os.environ.get("APP_USERNAME")
password = os.environ.get("APP_PASSWORD")

print(username)
# print(password)  # 実際の運用ではログに出さない

4. この方法のポイント

  • メリット
    • バッチやPythonに平文を書かなくて済む
    • GitHubに上げても環境変数は含まれない
  • 注意点
    • そのPCにログインできる人なら値を確認できる
    • 共有PCや社内PCでは権限設計もセットで考える

.envファイル+python-dotenv
で管理する

プロジェクト単位で設定を分けたいときに便利な方法です。

1. ライブラリのインストール

Bash
pip install python-dotenv

2. プロジェクト構成の例

Plaintext
my_project/
├── main.py
└── .env

3. .env ファイルの中身

Plaintext
APP_USERNAME=example_user
APP_PASSWORD=example_password
API_TOKEN=xxxxxxxxxxxxxxxx
  • KEY=VALUE 形式で1行ずつ書く
  • .envUTF-8のプレーンテキスト でOK

4. Pythonで .env を読み込む

Python
from dotenv import load_dotenv
import os

# カレントディレクトリの .env を読み込む
load_dotenv()

username = os.getenv("APP_USERNAME")
password = os.getenv("APP_PASSWORD")
api_token = os.getenv("API_TOKEN")

5. .gitignore に追加して漏洩を防ぐ

Gitで管理している場合は、リポジトリ直下に .gitignore を作成し、.env を除外します。

Plaintext
# .gitignore
.env

6. この方法のポイント

  • メリット
    • プロジェクトごとに設定を分けられる
    • Gitにさえ上げなければ、コードから秘匿情報を分離できる
  • 注意点
    • .env 自体は平文なので、PCにアクセスできる人には見える
    • バックアップや共有時に .env を含めないように注意

Windows資格情報マネージャー
+Python(keyring)

「環境変数や .env より、もう少し“ちゃんと”守りたい」場合の選択肢です。 Windowsのセキュアストレージに保存し、Pythonから取り出します。

1. 資格情報を登録する(コマンド例)

PowerShellまたはコマンドプロンプトで、次のように登録します。

PowerShell
cmdkey /add:my_app_service /user:app_user /pass:example_password
  • my_app_service:サービス名(任意の識別子)
  • app_user:ユーザー名
  • example_password:パスワード

※GUIで「資格情報マネージャー」から登録してもOKです。

2. Python側の準備(keyring)

Bash
pip install keyring

3. Pythonから資格情報を取得する

Python
import keyring

service_name = "my_app_service"

username = keyring.get_password(service_name, "username")
password = keyring.get_password(service_name, "password")

実際には、

  • 「ユーザー名」と「パスワード」を別々の資格情報として登録する
  • あるいは「パスワードだけ」を資格情報にして、ユーザー名は環境変数などで持つ といった設計にすることが多いです。

4. この方法のポイント

  • メリット
    • Windowsの仕組みで暗号化されて保存される
    • バッチやPythonに平文を置かなくて済む
  • 注意点
    • keyring の導入と、資格情報の登録手順をチームで揃える必要がある
    • スクリプトを配布する場合は「事前に資格情報を登録しておいてください」という一言が必要

GitHub Actions
のSecretsでクラウド側に隠す

リポジトリのワークフロー(自動実行)で秘匿情報を使う場合は、 GitHub ActionsのSecretsに入れるのが定番です。

1. Secretsの登録手順

  1. GitHubで対象リポジトリを開く
  2. Settings」→「Secrets and variables」→「Actions
  3. New repository secret」をクリック
  4. 例えば以下のように登録
    • NameAPP_API_TOKEN
    • Secretxxxxxxxxxxxxxxxx

2. ワークフロー(YAML)から参照する例

YAML
name: Example Workflow

on:
  workflow_dispatch:

jobs:
  run-script:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Run script
        env:
          APP_API_TOKEN: ${{ secrets.APP_API_TOKEN }}
        run: |
          python main.py

3. Python側で参照する

Python
import os

api_token = os.getenv("APP_API_TOKEN")

4. この方法のポイント

  • メリット
    • GitHub側で暗号化されて保存される
    • リポジトリのCollaboratorにも中身は見えない
  • 注意点
    • ローカル実行では使えないので、ローカル用の仕組み(環境変数や .env)と併用する

まとめ(記事の締めイメージ)

  • 直書きしないための選択肢は、ざっくり分けると次の4つ
    • Windowsの環境変数
    • プロジェクト単位の .envファイル
    • OSのセキュアストレージ(資格情報マネージャー+keyring
    • クラウド実行時の GitHub Actions Secrets
  • どれが正解かは「どこで動かすか」「誰がそのPCを触るか」で変わる
  • 共通して言えるのは、 「バッチやコードにパスワードを書かない」設計を最初に決めておくと、あとが楽ということ