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

「バッチファイルやPythonコードにパスワードやトークンを書きたくない」をテーマに、 現場でよく使う4つのパターンを、手順ベースでまとめた記事です。
- 対象OS:Windows
- 想定言語:バッチ(.bat)、Python
- 想定用途:APIキー、DB接続情報、ログインID/パスワードなどの秘匿情報

目次
4つのパターン
- Windowsの環境変数に逃がす
- .envファイル+python-dotenvで管理する
- Windows資格情報マネージャー+Python(keyring)で暗号化保存
- GitHub ActionsのSecretsでクラウド側に隠す
最後に、「バッチには何も書かず、Python側で全部読む」構成例も載せます。
Windowsの環境変数に逃がす
1. システム環境変数に登録する手順(GUI)
- スタートメニューで「環境変数」と検索
- 「システム環境変数の編集」を開く
- 「環境変数(N)...」ボタンをクリック
- 「ユーザー環境変数」または「システム環境変数」で「新規(N)...」
- 例えば以下のように登録
- 変数名:
APP_USERNAME - 変数値:
example_user - 変数名:
APP_PASSWORD - 変数値:
example_password
- 変数名:
- 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行ずつ書く.envは UTF-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の登録手順
- GitHubで対象リポジトリを開く
- 「Settings」→「Secrets and variables」→「Actions」
- 「New repository secret」をクリック
- 例えば以下のように登録
- Name:
APP_API_TOKEN - Secret:
xxxxxxxxxxxxxxxx
- Name:
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を触るか」で変わる
- 共通して言えるのは、 「バッチやコードにパスワードを書かない」設計を最初に決めておくと、あとが楽ということ


