「バッチスクリプトに平文でパスワードを書きたくないけれど、対話入力もできないし……」——Oracle の自動化運用で必ず一度は出てくる悩みです。シェルスクリプトの中に sqlplus user/pw@db と直書きすれば、プロセス一覧(ps -ef)から覗かれたり、うっかり Git に push してしまったりします。
この問題を解決する Oracle 標準の仕組みが Oracle Wallet による外部パスワードストア(Secure External Password Store / SEPS)です。事前にウォレットに認証情報を仕込んでおくと、スクリプトは sqlplus /@db_alias と書くだけで接続できます。パスワードがどこにも出てこないため、バッチ・cron・systemd・GitHub Actions・GitLab CI のようなあらゆる自動化から、パスワードを持たない安全な Oracle 接続が可能になります。
この記事では mkstore の全オプション、sqlnet.ora と TNS_ADMIN の正しい設定、cwallet.sso と ewallet.p12 の違い、orapki による OS ユーザー縛りウォレット、パスワードローテーションの運用手順、SQL*Plus / RMAN / Data Pump / DGMGRL / シェルスクリプトでの使い方まで、2026 年 4 月時点の 19c / 23ai に対応した内容で解説します。
SEPS(Secure External Password Store)とは何か
SEPS は「接続識別子(TNS 別名)とユーザー名・パスワードのペア」をクライアント側ウォレットに保存し、接続時に OS とウォレットが自動的に認証情報を差し込む仕組みです。アプリケーションのソースコードや環境変数、コマンドライン引数にパスワードが一切現れません。
| 従来の方式 | SEPS を使った方式 |
|---|---|
sqlplus batch_user/Pass123@orcl |
sqlplus /@orcl |
| ps コマンドでパスワードが見える | プロセスリストから一切見えない |
| シェルスクリプトに平文で保存 | スクリプトには別名だけ(パスワードなし) |
| パスワード変更時に全スクリプト修正 | mkstore -modifyCredential 1 回で完結 |
| ログファイルに漏洩リスク | ウォレットにアクセス制御(chmod 600)で対処 |
ウォレットのファイル形式と違い
ウォレットディレクトリには通常 2 種類のファイルが生成されます。用途と安全性の違いを理解しておくことが重要です。
| ファイル | 形式 | パスワード | 使いどころ |
|---|---|---|---|
ewallet.p12 |
PKCS#12 暗号化 | 毎回必要 | 管理者の編集用。手で mkstore を打つ時に使う |
cwallet.sso |
Auto Login(SSO) | 不要 | バッチ・自動化スクリプトからの接続に使う本命 |
| Auto Login Local | SSO + OS ユーザー縛り | 不要 | 同一 OS ユーザーでしか開けない。セキュリティ強化版 |
chmod 600 cwallet.sso で所有者以外は読めなくし、所有者も Oracle 運用専用の OS ユーザー(例: oracle / batch)に限定してください。NFS 共有ディレクトリに置く場合は必ずパーミッション管理も合わせて確認します。完全セットアップ手順 ── 最短 4 ステップ
既に tnsnames.ora で接続先エイリアスが定義されている前提で、4 ステップで完結します。
Step 1 ── ウォレットディレクトリを作成
# 専用ディレクトリを作成(TNS 設定ディレクトリ配下が定石) mkdir -p $ORACLE_HOME/network/admin/wallet chmod 700 $ORACLE_HOME/network/admin/wallet chown oracle:oinstall $ORACLE_HOME/network/admin/wallet
Step 2 ── mkstore でウォレット本体を作成
# -create: ewallet.p12 + cwallet.sso を両方生成 mkstore -wrl $ORACLE_HOME/network/admin/wallet -create # プロンプト: # Enter password: ******** ← ウォレット自体を守るマスターパスワード # Enter password again: ******** # 結果確認 ls -la $ORACLE_HOME/network/admin/wallet # ewallet.p12 ← 編集時に使う # cwallet.sso ← 実行時に使う(Auto Login)
Step 3 ── TNS 別名と認証情報をウォレットに登録
# -createCredential <TNS別名> <ユーザー名> <パスワード> mkstore -wrl $ORACLE_HOME/network/admin/wallet \ -createCredential orcl_batch batch_user # プロンプト: # Enter your secret/Password: ******** ← DB ユーザーのパスワード # Re-enter your secret/Password: ******** # Enter wallet password: ******** ← Step 2 で設定したウォレットパスワード # 登録内容を確認 mkstore -wrl $ORACLE_HOME/network/admin/wallet -listCredential # orcl_batch batch_user
-createCredential orcl_batch batch_user pw123 のように引数にパスワードを書くと、bash の history に残ってしまいます。必ずユーザー名だけ指定して、対話プロンプトで入力する形が推奨です。Step 4 ── sqlnet.ora で SEPS を有効化
# ウォレット場所を指定
WALLET_LOCATION =
(SOURCE = (METHOD = FILE)
(METHOD_DATA = (DIRECTORY = /u01/app/oracle/product/19c/dbhome_1/network/admin/wallet))
)
# ウォレットで OS 認証を上書きする(SEPS を使う時の必須)
SQLNET.WALLET_OVERRIDE = TRUE
WALLET_LOCATION のパスは絶対パスで記載し、環境変数($ORACLE_HOME)を展開した形で書きます。sqlnet.ora は Oracle が環境変数を解釈しないため、そのまま書くと接続時に「ウォレットが見つからない」エラーになります。接続確認
# TNS_ADMIN がウォレットと sqlnet.ora を含むディレクトリを指す export TNS_ADMIN=$ORACLE_HOME/network/admin # パスワードレス接続! sqlplus /@orcl_batch # 結果 # SQL*Plus: Release 19.0.0.0.0 - Production on ... # Connected to: Oracle Database 19c Enterprise Edition ... # SQL> SHOW USER # USER is "BATCH_USER"
mkstore コマンド全リファレンス
ウォレットの運用で使う主要コマンドをまとめます。ウォレットパスワードは毎回プロンプトで聞かれます。
| 操作 | コマンド |
|---|---|
| ウォレット作成 | mkstore -wrl <path> -create |
| 認証情報の追加 | mkstore -wrl <path> -createCredential <alias> <user> |
| 認証情報の変更 | mkstore -wrl <path> -modifyCredential <alias> <user> |
| 認証情報の削除 | mkstore -wrl <path> -deleteCredential <alias> |
| 登録一覧表示 | mkstore -wrl <path> -listCredential |
| 任意キーの追加 | mkstore -wrl <path> -createEntry <key> <value> |
| 任意キーの参照 | mkstore -wrl <path> -viewEntry <key> |
| ウォレットパスワード変更 | mkstore -wrl <path> -modifyWalletPassword |
| Auto Login 再生成 | ウォレットを -create し直すか orapki を使用 |
各クライアントからの利用パターン
SEPS は Oracle Net 層で動くため、Oracle Net を経由するすべてのツールでそのまま使えます。以下は代表例です。
SQL*Plus
# インタラクティブ接続 sqlplus /@orcl_batch # SQL スクリプト実行 sqlplus -s /@orcl_batch @/path/to/job.sql # スクリプト内でユーザー切り替え(同一 TNS 別名に別ユーザー) sqlplus /@orcl_admin
RMAN(バックアップ)
# ターゲット DB にウォレット経由で接続 rman target /@orcl_prod # カタログ DB も使う場合 rman target /@orcl_prod catalog /@rman_cat
Data Pump(expdp / impdp)
# TNS 別名=パスワードレス接続 expdp /@orcl_batch \ DIRECTORY=DATA_PUMP_DIR \ SCHEMAS=app_owner \ DUMPFILE=app_owner_%U.dmp \ LOGFILE=app_owner.log
DGMGRL(Data Guard Broker)
dgmgrl /@dgconfig DGMGRL> SHOW CONFIGURATION;
Shell スクリプトでのバッチ運用
#!/bin/bash
set -euo pipefail
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$ORACLE_HOME/bin:$PATH
# パスワードが一切コード上に現れない
sqlplus -s /@orcl_batch <<'SQL'
SET SERVEROUTPUT ON
BEGIN
pkg_daily.run_summary;
END;
/
EXIT;
SQL
cron / systemd timer からの呼び出し
# /etc/cron.d/oracle-batch # 毎日 3:00 に実行。TNS_ADMIN をフル指定(cron は最小環境で動くため) 0 3 * * * oracle TNS_ADMIN=/u01/app/oracle/product/19c/dbhome_1/network/admin \ /opt/batch/daily_summary.sh >> /var/log/oracle/batch.log 2>&1
TNS_ADMIN / ORACLE_HOME / LD_LIBRARY_PATH を必ずコマンドラインで指定します。systemd timer を使う場合は Environment= ディレクティブで明示してください。orapki で Auto Login Local ウォレットを作る(強化版)
通常の Auto Login ウォレット(cwallet.sso)は、ファイルを読めれば他のユーザーでも使えます。これを「特定 OS ユーザーでしか開けない」状態にするのが orapki の Auto Login Local ウォレットです。
# 既存ウォレットを Auto Login Local 化 orapki wallet create -wallet $ORACLE_HOME/network/admin/wallet \ -auto_login_local # プロンプトでウォレットパスワードを入力 # 完了後、cwallet.sso が Auto Login Local に置き換わる # ウォレットを作成した OS ユーザーでのみ自動ログインが効く # 他の OS ユーザーがコピーしても開けない
パスワードローテーションの運用手順
SEPS 運用で一番ハマるのが「ALTER USER ... IDENTIFIED BY 新パスワード した後、ウォレットの更新を忘れてバッチが全滅する」パターンです。必ずセットで実施します。
# 1) DB 側でパスワードを変更(新パスワードを控える) sqlplus /@orcl_admin SQL> ALTER USER batch_user IDENTIFIED BY "NewPw_2026#04"; SQL> EXIT; # 2) ウォレットの認証情報を更新 mkstore -wrl $ORACLE_HOME/network/admin/wallet \ -modifyCredential orcl_batch batch_user # プロンプトで NewPw_2026#04 を入力 # 3) 接続テスト sqlplus /@orcl_batch SQL> SHOW USER -- BATCH_USER と表示されれば成功 # 4) バッチサーバーが複数ある場合: 新しい cwallet.sso を安全にコピー scp $ORACLE_HOME/network/admin/wallet/cwallet.sso \ batch02:$ORACLE_HOME/network/admin/wallet/ # 5) コピー先のパーミッションを必ず再設定 ssh batch02 "chmod 600 $ORACLE_HOME/network/admin/wallet/cwallet.sso"
1 つのウォレットで複数 DB の認証情報を管理する
1 つのウォレットに複数の TNS 別名+ユーザーを登録できます。開発・検証・本番や、複数のアプリスキーマがある運用で便利です。
# 本番 DB のバッチユーザー mkstore -wrl $WALLET -createCredential orcl_prod batch_user # ステージング DB mkstore -wrl $WALLET -createCredential orcl_stage batch_user # 読み取り専用レポート用 mkstore -wrl $WALLET -createCredential orcl_report report_user # RMAN カタログ用 mkstore -wrl $WALLET -createCredential rman_cat rman_catalog_owner # 登録内容 mkstore -wrl $WALLET -listCredential # orcl_prod batch_user # orcl_stage batch_user # orcl_report report_user # rman_cat rman_catalog_owner
orcl_prod_batch / orcl_prod_admin)必要があります。セキュリティ考慮事項
ウォレットファイルを Git にコミットしない
ウォレットは認証情報そのものです。バックアップを Git に入れたくなっても、絶対にリポジトリにコミットしないでください。.gitignore で *.p12 / *.sso を除外し、ウォレットの配布は SCP や構成管理ツール(Ansible / Puppet の機密管理モジュール)を使います。
ファイル権限と所有者
chmod 700 $ORACLE_HOME/network/admin/wallet chmod 600 $ORACLE_HOME/network/admin/wallet/cwallet.sso chmod 600 $ORACLE_HOME/network/admin/wallet/ewallet.p12 chown oracle:oinstall $ORACLE_HOME/network/admin/wallet*
Linux の読み取りで cwallet.sso が漏れるリスク
cwallet.sso は「読めれば使える」仕様なので、OS 侵入や誤コピーで他者に渡ると認証が奪取されます。本番環境では orapki -auto_login_local で OS ユーザー固定ウォレットにするか、ウォレット自体を root 所有にして SELinux / AppArmor でアクセス制御を追加する、などの多層防御を検討します。
監査設定の調整
SEPS 接続は Unified Audit では EXTERNAL NAME ではなく通常のパスワード認証として記録されます。バッチユーザーのログインに関するアラートや、DBA_USERS.AUTHENTICATION_TYPE での識別はできませんが、V$SESSION.OSUSER と MACHINE を組み合わせてバッチサーバーからの接続かをチェックできます。監査の詳細は 統合監査完全ガイド を参照してください。
パスワード強度と有効期限の扱い
SEPS で運用するバッチユーザーでも PASSWORD_LIFE_TIME は効きます。期限切れに気づかずバッチ全滅、を避けるために「バッチユーザー用プロファイル」を作成し、PASSWORD_LIFE_TIME UNLIMITED ではなく PASSWORD_LIFE_TIME 90 程度にしつつ、切り替え手順をカレンダーに組み込むのが王道です。プロファイル設計は プロファイル完全ガイド が詳しいです。
よくあるトラブルシュート
ORA-12578: TNS: wallet open failed
ウォレットのパスを sqlnet.ora で正しく指定できていないか、ファイル権限が読めない状態。ls -la で権限を確認し、TNS_ADMIN が sqlnet.ora を含むディレクトリを指しているか検証します。
ORA-01017: invalid username/password
ウォレットに登録したパスワードと DB 側のパスワードが不一致。ALTER USER 後のウォレット更新を忘れた時に頻発します。-modifyCredential で再登録してください。大文字小文字の違いにも注意(ORA-01017 完全ガイド 参照)。
sqlplus /@orcl_batch で普通に ORA-12154
tnsnames.ora に orcl_batch の定義がないか、TNS_ADMIN が正しいディレクトリを指していない。tnsping orcl_batch で応答するか確認し、必要なら tnsnames.ora にエントリを追加します。
「Connected to idle instance」と表示される
ウォレット経由で接続しようとしてもローカル DB にフォールバックしている状態。SQLNET.WALLET_OVERRIDE = TRUE が sqlnet.ora に書かれているか、値のスペルが正しいかを確認します。
Windows 環境でウォレットが認識されない
Windows の場合は %ORACLE_HOME%\network\admin\wallet にウォレットを置き、TNS_ADMIN をシステム環境変数で設定します。パス区切りがバックスラッシュになるため、sqlnet.ora の DIRECTORY も Windows パス記法で書く必要があります。
よくある質問
oraclepki.jar を依存に追加し、接続 URL を jdbc:oracle:thin:/@orcl_batch?TNS_ADMIN=/path/to/wallet_dir の形式にします。JDBC OCI ドライバはネイティブ Oracle Net を使うため、sqlnet.ora の設定だけで動作します。Spring Boot / HikariCP の場合は url プロパティに上記形式を書き、パスワードを指定しないだけで OK です。cwallet.sso)であれば、そのファイルを読める OS ユーザーなら誰でも接続できます。これがセキュリティ上の懸念になる場合、orapki -auto_login_local を使えば作成した OS ユーザーしか開けない形式になります。ただし Local ウォレットは他ホストに配布できないため、「バッチサーバーの oracle ユーザー固定で運用」を徹底できる場合にのみ選ぶ選択肢です。orcl_prod と打つつもりで orcl_stage と打つ事故が起きた時のリカバリ手順が複雑になります。環境ごとに 別ホスト・別ウォレット・別 TNS 別名で分離し、TNS_ADMIN を環境変数で切り替えるのが標準構成です。ewallet.p12 が残っていれば、orapki wallet create -wallet <path> -auto_login でマスターパスワードを入力して cwallet.sso を再生成できます。両方失った場合はウォレット自体を -create し直し、-createCredential で認証情報を再登録するしかありません。このため、ウォレットのバックアップは 秘匿領域に定期的にコピーしておくのが定石です(ただし Git には置かない)。/ as sysdba)は何が違いますか?dba)に所属していれば接続できる」仕組みで、管理権限接続(SYSDBA / SYSOPER)で主に使います。一方 SEPS は「通常の DB ユーザー+パスワード認証を、ウォレット経由で自動化する」仕組みです。前者は管理者用、後者はアプリやバッチ用、と住み分けます。SYS / SYSDBA の詳細は SYS・SYSTEM・SYSDBA の違い完全ガイド を参照してください。*_client_credentials.zip)が提供され、これを解凍して TNS_ADMIN に指定することで同じ sqlplus /@db_alias 接続が可能です。OCI 側のウォレットには TLS 証明書も含まれているため、SEPS(パスワード格納)と TLS(通信暗号化)の両方を 1 つのウォレットでまかなえる構成になっています。TANAKA)の認証情報をウォレットに入れ、sqlplus tanaka[app_owner]/@orcl_batch のような形で「個人認証+スキーマ権限+パスワードレス」を全部同時に実現できます。監査ログには DBPROXY_USERNAME=TANAKA / DBUSERNAME=APP_OWNER が残り、運用スクリプトにパスワードが一切出てこない状態になります。プロキシの詳細は プロキシユーザー完全ガイド を参照してください。まとめ
- SEPS は「スクリプトに平文パスワードを書かせない」Oracle 標準の仕組み。バッチ・cron・CI/CD に最適
- ウォレットは 2 種類(
ewallet.p12:編集用、cwallet.sso:実行時用)。Auto Login Local を使えば OS ユーザー縛りも可能 - セットアップは 4 ステップ: ディレクトリ作成 →
mkstore -create→-createCredential→sqlnet.ora更新 - sqlnet.ora は
WALLET_LOCATIONとSQLNET.WALLET_OVERRIDE=TRUEが必須。パスは絶対パスで書く - SQL*Plus / RMAN / Data Pump / DGMGRL / JDBC すべてに対応。Oracle Net を通る処理ならそのまま使える
- パスワード変更時は必ず
ALTER USER→-modifyCredentialの順で実行。順序を逆にすると認証エラーで止まる - プロキシユーザーと組み合わせると個人認証+パスワードレス+監査の三冠。バッチ・CI/CD の理想形
- ウォレットは絶対に Git にコミットしない。ファイル権限は
600、配布はセキュアな構成管理ツールで
関連する運用トピックは、権限確認の Oracle ユーザ権限を確認する方法完全ガイド、管理ユーザーと管理権限の設計は SYS・SYSTEM・SYSDBA の違い完全ガイド、共有アカウントを個人認証に移行する プロキシユーザー完全ガイド、バックアップ運用は RMAN 完全ガイド、エクスポート運用は Data Pump 完全ガイド、TNS / ネットワーク設定は ネットワーク設定完全ガイド もあわせてご覧ください。

