【Oracle】Oracle Wallet(外部パスワードストア/SEPS)完全ガイド|mkstore でパスワードレス接続を実装・sqlnet.ora 設定・バッチ/CI/CD の自動化認証・パスワードローテーション運用まで解説

【Oracle】Oracle Wallet(外部パスワードストア/SEPS)完全ガイド|mkstore でパスワードレス接続を実装・sqlnet.ora 設定・バッチ/CI/CD の自動化認証・パスワードローテーション運用まで解説 Oracle

「バッチスクリプトに平文でパスワードを書きたくないけれど、対話入力もできないし……」——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.oraTNS_ADMIN の正しい設定、cwallet.ssoewallet.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)で対処
もっと上位の考え方: SEPS は「アプリにパスワードを持たせない運用」を実現するための Oracle 標準手段です。個人認証を徹底したい場合は プロキシユーザー完全ガイド と組み合わせると、「バッチユーザーで認証してアプリスキーマとして動く」構成が安全に実現できます。

ウォレットのファイル形式と違い

ウォレットディレクトリには通常 2 種類のファイルが生成されます。用途と安全性の違いを理解しておくことが重要です。

ファイル 形式 パスワード 使いどころ
ewallet.p12 PKCS#12 暗号化 毎回必要 管理者の編集用。手で mkstore を打つ時に使う
cwallet.sso Auto Login(SSO) 不要 バッチ・自動化スクリプトからの接続に使う本命
Auto Login Local SSO + OS ユーザー縛り 不要 同一 OS ユーザーでしか開けない。セキュリティ強化版
cwallet.sso は「そのファイルを読める人なら誰でも使える」という意味です。 必ず 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 を有効化

$ORACLE_HOME/network/admin/sqlnet.ora
# ウォレット場所を指定
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 と SQL スクリプト
# インタラクティブ接続
sqlplus /@orcl_batch

# SQL スクリプト実行
sqlplus -s /@orcl_batch @/path/to/job.sql

# スクリプト内でユーザー切り替え(同一 TNS 別名に別ユーザー)
sqlplus /@orcl_admin

RMAN(バックアップ)

RMAN でのパスワードレス接続
# ターゲット DB にウォレット経由で接続
rman target /@orcl_prod

# カタログ DB も使う場合
rman target /@orcl_prod catalog /@rman_cat

Data Pump(expdp / impdp)

Data Pump エクスポート
# TNS 別名=パスワードレス接続
expdp /@orcl_batch \
  DIRECTORY=DATA_PUMP_DIR \
  SCHEMAS=app_owner \
  DUMPFILE=app_owner_%U.dmp \
  LOGFILE=app_owner.log
Data Pump の詳細は Data Pump 完全ガイド、RMAN は RMAN 完全ガイド を参照してください。いずれも SEPS と組み合わせて無人バックアップ / 復旧を組めます。

DGMGRL(Data Guard Broker)

DGMGRL でのパスワードレス接続
dgmgrl /@dgconfig
DGMGRL> SHOW CONFIGURATION;

Shell スクリプトでのバッチ運用

batch.sh ── ウォレット経由での日次バッチ例
#!/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 からの呼び出し

cron 設定例(oracle ユーザーの crontab)
# /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
cron 運用のコツ: cron は PATH や環境変数を引き継がないため、TNS_ADMIN / ORACLE_HOME / LD_LIBRARY_PATH を必ずコマンドラインで指定します。systemd timer を使う場合は Environment= ディレクティブで明示してください。

orapki で Auto Login Local ウォレットを作る(強化版)

通常の Auto Login ウォレット(cwallet.sso)は、ファイルを読めれば他のユーザーでも使えます。これを「特定 OS ユーザーでしか開けない」状態にするのが orapki の Auto Login Local ウォレットです。

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 ユーザーがコピーしても開けない
Auto Login Local の制約: ウォレットを作成した OS ユーザーのホスト・UID に紐づくため、サーバー移行や OS ユーザー変更時には作り直しが必要です。セキュリティは強化されますが、配布型の運用(同じウォレットを複数ホストに撒く)には向きません。バッチサーバー 1 台で完結する運用で効果を発揮します。

パスワードローテーションの運用手順

SEPS 運用で一番ハマるのが「ALTER USER ... IDENTIFIED BY 新パスワード した後、ウォレットの更新を忘れてバッチが全滅する」パターンです。必ずセットで実施します。

パスワードローテーション(5 ステップ)
# 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"
順序厳守: DB 側パスワード変更 → ウォレット更新 の順で実施します。ウォレットを先に更新すると、新パスワードがまだ DB で有効化されていないため、次のバッチが認証エラーで落ちます。逆パターンも同様で、必ず「同じタイミングで両方変える」運用プロセスにしてください。

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
1 エイリアス=1 ユーザー固定の制約: 同じ TNS 別名に対して複数のユーザーを紐づけることはできません。「本番 DB に batch_user と admin_user の両方を使い分けたい」場合は、tnsnames.ora 側で別名を分ける(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.OSUSERMACHINE を組み合わせてバッチサーバーからの接続かをチェックできます。監査の詳細は 統合監査完全ガイド を参照してください。

パスワード強度と有効期限の扱い

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 = TRUEsqlnet.ora に書かれているか、値のスペルが正しいかを確認します。

Windows 環境でウォレットが認識されない

Windows の場合は %ORACLE_HOME%\network\admin\wallet にウォレットを置き、TNS_ADMIN をシステム環境変数で設定します。パス区切りがバックスラッシュになるため、sqlnet.oraDIRECTORY も Windows パス記法で書く必要があります。

よくある質問

QOracle Wallet と SEPS は同じものですか?
A厳密には違います。Oracle Wallet は「証明書や秘密鍵を格納する汎用コンテナ」の総称で、TDE(透過的データ暗号化)の鍵、SSL/TLS 証明書、SEPS の認証情報などを扱います。SEPS はその Wallet の一用途として「DB 接続パスワードを格納する機能」です。この記事では SEPS 用途の Wallet を「ウォレット」と呼んで解説しています。TDE 用の Wallet とは別物のため、混同しないように設計してください。
QJDBC アプリでも Oracle Wallet を使えますか?
A使えます。JDBC Thin ドライバは 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 です。
Qtnsnames.ora の接続先がウォレットで認証されている場合、別 OS ユーザーで接続するとどうなりますか?
A通常の Auto Login(cwallet.sso)であれば、そのファイルを読める OS ユーザーなら誰でも接続できます。これがセキュリティ上の懸念になる場合、orapki -auto_login_local を使えば作成した OS ユーザーしか開けない形式になります。ただし Local ウォレットは他ホストに配布できないため、「バッチサーバーの oracle ユーザー固定で運用」を徹底できる場合にのみ選ぶ選択肢です。
Q本番・検証・開発で別々のウォレットを持つべきですか?
Aはい、必須です。同じウォレットに本番と検証の認証情報を混ぜると、orcl_prod と打つつもりで orcl_stage と打つ事故が起きた時のリカバリ手順が複雑になります。環境ごとに 別ホスト・別ウォレット・別 TNS 別名で分離し、TNS_ADMIN を環境変数で切り替えるのが標準構成です。
Qcwallet.sso を失った場合の復旧方法は?
Aewallet.p12 が残っていれば、orapki wallet create -wallet <path> -auto_login でマスターパスワードを入力して cwallet.sso を再生成できます。両方失った場合はウォレット自体を -create し直し、-createCredential で認証情報を再登録するしかありません。このため、ウォレットのバックアップは 秘匿領域に定期的にコピーしておくのが定石です(ただし Git には置かない)。
Qパスワードレス接続と OS 認証(/ as sysdba)は何が違いますか?
AOS 認証は「OS ユーザーが特定グループ(dba)に所属していれば接続できる」仕組みで、管理権限接続(SYSDBA / SYSOPER)で主に使います。一方 SEPS は「通常の DB ユーザー+パスワード認証を、ウォレット経由で自動化する」仕組みです。前者は管理者用、後者はアプリやバッチ用、と住み分けます。SYS / SYSDBA の詳細は SYS・SYSTEM・SYSDBA の違い完全ガイド を参照してください。
QOracle Cloud Infrastructure(OCI)・Autonomous Database でも SEPS は使えますか?
A使えます。Autonomous Database ではクライアント側から接続するためのクライアント資格証明ウォレット(*_client_credentials.zip)が提供され、これを解凍して TNS_ADMIN に指定することで同じ sqlplus /@db_alias 接続が可能です。OCI 側のウォレットには TLS 証明書も含まれているため、SEPS(パスワード格納)と TLS(通信暗号化)の両方を 1 つのウォレットでまかなえる構成になっています。
QSEPS とプロキシユーザーを組み合わせるベストプラクティスはありますか?
Aはい、これが理想形です。個人プロキシユーザー(例: 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-createCredentialsqlnet.ora 更新
  • sqlnet.ora は WALLET_LOCATIONSQLNET.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 / ネットワーク設定は ネットワーク設定完全ガイド もあわせてご覧ください。