JS7® JobSchedulerクレデンシャルストア機能

JS7®JobSchedulerは独SOS社(Software- und Organisations-Service GmbH)によって開発されている、ジョブ管理システムです。
クレデンシャルストア機能とは、ジョブの中から外部ホストやメールサーバー、データベースなどにログイン認証が必要な場合、いちいちアカウント認証情報をジョブに記載したり公開鍵情報を外部ファイルに記録することなく、ジョブからアクセス可能にする仕組みです。
またクレデンシャルストアを使用することによって、認証情報を秘匿しながら集中管理を可能にします。
本記事では、JS7®JobSchedulerでクレデンシャルストアを利用する方法を記載しています。

https://kb.sos-berlin.com/display/JS7/JS7+-+Credential+Store

詳細な情報については、以下をご覧下さい。
- ナレッジベース（英語）　https://kb.sos-berlin.com/display/PKB/JS7
- 日本語紹介資料 https://www.ossl.co.jp/
- 日本語フォーラム　https://groups.google.com/forum/?hl=ja#!forum/jobscheduler-ja
- Facebook https://www.facebook.com/Jobscheduler-Japan-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-594469610565511/timeline/
- 日本JobSchedulerユーザーグループ https://sites.google.com/site/jobschedulerja/
- JIRA（英語） 　https://change.sos-berlin.com/secure/Dashboard.jspa
- User Forum（英語）　http://sourceforge.net/projects/jobscheduler/forums/forum/486122
- SOS社ホームページ　http://www.sos-berlin.com

# 1. 前提条件

JS7® JobScheduler V.2.3以上がインストール済みであること
ワークフローの作成／実行が一通りできること
JS7® JobSchedulerの概要及びインストール方法については以下を参照ください
**Dockerでのインストール手順**　https://qiita.com/satoruf/items/360fee5293611433ed33
**Windowsでのインストール手順**　https://qiita.com/Yoshitami/items/6804584592956a483364
**Linux/CLIでのインストール手順**　https://qiita.com/satoruf/items/fa9846f4376d1a50a67e
**JS7® JobSchedulerクイックスタート**https://qiita.com/satoruf/items/96f21ef25bcb35e47b21

# 2. はじめに
## (1) KeePassについて

[KeePass](https://ja.wikipedia.org/wiki/KeePass)は、フリーかつオープンソースのパスワードマネージャーであり、WindowsやLinuxやmacOS、Androidなど様々なプラットフォームに移植され、1Password、Dashlane、LastPassと並んで最も広く使用されています。
JS7®JobSchedulerでは、KeePassで作成した暗号化されたデータベースファイルをクレデンシャルストアとして利用し、下記のジョブで使用できます。
- [JS7 - Shellジョブ](https://kb.sos-berlin.com/display/JS7/JS7+-+Jobs)
- [JS7 - JITL SSHジョブ](https://kb.sos-berlin.com/display/JS7/JS7+-+JITL+SSHJob)
- [JS7 - JITL データベースジョブ](https://kb.sos-berlin.com/display/JS7/JS7+-+JITL+Database+Jobs)
- [JS7 - JITL メールジョブ](https://kb.sos-berlin.com/display/JS7/JS7+-+JITL+Mail+Jobs)
- [JS7 - JITL SAPS4HANAJob](https://kb.sos-berlin.com/display/JS7/JS7+-+JITL+SAP+Jobs)
- [JS7 - ファイル転送](https://kb.sos-berlin.com/display/JS7/JS7+-+File+Transfer)

## (2) KeePassのインストール

本記事ではKeePassプロジェクトからフォークされた[KeePassXC](https://ja.wikipedia.org/wiki/KeePassXC) V.2.7.1（2022/6時点の最新版）を使用します。
KeePassXCの[ダウンロードサイト](https://keepassxc.org/download/)から使用するプラットフォームを選択しダウンロードします。Windows版の場合は、"Portable ZIP archive"にするとUSBメモリーなどに保存展開でき複数のPCで使用できます。

## (3) KeePassデータベースファイルの作成、配布

インストール後初めてKeePassを起動すると下記ダイアログが表示されるので、「新しいデータベースを作成する」をクリックします。
![スクリーンショット 2022-06-10 14.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/f222356e-f1fa-71f4-ffa7-88d72d90adbf.png)
データベース名は適当に入力して続きをクリックし、データベースの形式を「KDBX 3」を選択します。
※JS7 V.2.3では、KDBX 4形式はエラーになります。
![スクリーンショット 2022-06-14 15.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/b9abd8ba-8ece-0202-9bc4-e3c9db193642.png)
続きをクリックするとマスターパスワード入力画面になりますが、パスワードは入力せずに「保護を追加」をクリックします。
※パスワードを使用することもできますが、ジョブの設定や引数にパスワードを記載することが必要になります。
![スクリーンショット 2022-06-14 15.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/ca83f88c-4cbd-48bf-549e-a349d0b3b9f1.png)
キーファイルの名前を入力し、生成をクリックしてキーファイルを保存して終了します。
![スクリーンショット 2022-06-14 15.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/e9fee892-d498-68f6-18cb-5c45d3131580.png)
これでデータベースファイル(*.kdbx)とキーファイル(*.keyx)が作成できましたので、次はエントリーを作成します。
![スクリーンショット 2022-06-14 15.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/c635590d-cebf-e900-92e7-d9d1a9188276.png)
まず左側に表示されている「ルート」フォルダをクリックして適当な名称（本記事ではdemo）に変更します。KeePassではサブフォルダーを作成してエントリーをグルーピングすることができます。
次にエントリーメニューから新しいエントリーを選択し項目を入力していきます。
![スクリーンショット 2022-06-14 15.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/3be9b386-441a-b2cf-4993-a407aa9fdc58.png)
- タイトル：　ホスト名などキーとなるエントリー名
- ユーザー名： ログインアカウント
- パスワード：　ログインパスワード
- URL: IPアドレス、FQDN、URL
- タグ：　分類用
パスワードを使用せず公開鍵認証することも可能です。その場合は詳細設定を選択し添付ファイルに公開鍵ファイルを登録します。
![スクリーンショット 2022-06-14 15.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/9918975a-be18-cee9-939d-770b551d5e62.png)
OKをクリックし、正しく登録されたことを確認します。
![スクリーンショット 2022-06-14 15.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/37153f33-ba95-2409-1dba-0e875e745e65.png)
以下必要な認証情報を順次追加し終わったらアプリケーションを終了します。
作成したデータベースファイル(*.kdbx)とキーファイル(*.keyx)は、ジョブを実行するエージェントからアクセスできるところに配置します。ファイル転送ジョブによる各エージェントへの配布やNFSやクラウド上の共有ファイルでも構いません。
各ファイルをエージェントの任意のディレクトリに配置し、パーミッションがエージェント実行ユーザーになっていることを確認します。

# 3. JS7 - Shellジョブからの利用
https://kb.sos-berlin.com/display/JS7/JS7+-+Use+of+Credential+Store+with+Shell+Jobs

JS7エージェントでは、クレデンシャルストアを読み出すshellスクリプト```/bin/agent_credential_value.sh ```が提供されています。
ジョブスクリプトサンプル：
```
echo $JS7_AGENT_HOME
JS7_CREDENTIAL_VALUE=`"$JS7_AGENT_HOME/bin/agent_credential_value.sh" "cs://demo/js7centos7@attachment?file=$JS7_AGENT_CONFIG_DIR/demo.kdbx&key_file=$JS7_AGENT_CONFIG_DIR/demo.keyx"`
RC=$?
if [ $RC -ne 0 ]
then
    exit $RC
fi
echo $JS7_CREDENTIAL_VALUE
```
- $JS7_AGENT_HOME：ジョブリソースDefaultで定義されているエージェントのホームディレクトリパス変数
- $JS7_AGENT_CONFIG_DIR:ジョブリソースDefaultで定義されているエージェントのconfigディレクトリパス変数
- cs://[entry_path]@[property_name]:クレデンシャルストアの問い合わせ先エントリーパス
　[entry_path]はフォルダーパス+タイトル
　[property_name]は取得するデータ属性（title, user, password, url, attachmentなどKeePassで登録した内容）
- ?以降は引数、複数ある場合は&で繋ぎます。
　file=: データベースファイルのパス（必須）
　key_file=: キーファイルのパス（オプション）
　password=: データベースのマスターパスワード（オプション）

上記ジョブのログ出力例
```
2022-06-14 15:42:39.997+09:00 [MAIN] [OrderStarted] id=#2022-06-14#T18895988603-root, pos=0
2022-06-14 15:42:40.094+09:00 [MAIN] [OrderProcessingStarted] id=#2022-06-14#T18895988603-root, pos=0, Job=shell_cs, Agent(url=http://js7-agent-standalone:4445, name=primaryAgent, time=2022-06-14 15:42:39.997+09:00)
2022-06-14 15:42:39.997+09:00 [MAIN]    [Start] Job=shell_cs, Agent (url=http://js7-agent-standalone:4445, id=js7-agent-standalone, name=primaryAgent)
2022-06-14 15:42:40.431+09:00 [STDOUT]  /var/sos-berlin.com/js7/agent
2022-06-14 15:42:42.475+09:00 [STDOUT]  -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAweXfI2dW0jrWUkbUqNmPBWvNbg4ZZXvi6p3I82UYoHlOWeke ..... -----END RSA PRIVATE KEY-----
2022-06-14 15:42:42.480+09:00 [MAIN]    [End] [Success] returnCode=0
2022-06-14 15:42:42.587+09:00 [SUCCESS] [OrderProcessed] id=#2022-06-14#T18895988603-root, pos=0, Job=shell_cs, Agent(time=2022-06-14 15:42:42.480+09:00), returnCode=0
2022-06-14 15:42:42.750+09:00 [MAIN] [OrderFinished] id=#2022-06-14#T18895988603-root, pos=1
```
# 4. JS7 -JITLジョブからの利用
https://kb.sos-berlin.com/display/JS7/JS7+-+Use+of+Credential+Store+with+JITL+Jobs

頻繁に使用するジョブ機能をテンプレートとしてJavaのクラスが提供されているものをJITLと呼び、前記のようなさまざまなJITLジョブでクレデンシャルストアが使用できます。
本記事では代表的な[JS7 - SSHジョブ](https://kb.sos-berlin.com/display/JS7/JS7+-+JITL+SSHJob)を例にとって説明します。

## (1) JITL - SSHジョブの作成
JOCコックピットのジョブ定義画面から新規ワークフロー作成を選択し、ジョブを作成します。
ジョブクラスをJITLを選択しウイザードをクリックします。
![jitlsshjob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/11311006-817a-8ac8-3d25-b134ff234c91.png)
JITLジョブの一覧が表示されるので、SSHJobを選択し次をクリックします。
![jitlsshjob2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/17192af4-aba2-72b9-cefa-80fa89537a15.png)

## (2) 引数の設定
パラメーターが表示されるので、下記の項目を有効にして入力します。
![スクリーンショット 2022-06-15 11.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/abd2e48b-f08e-8045-c457-91df53a741ac.png)
引数の概略
| 引数 |説明|例|
|:-:|:-:|:-:|
|host|SSH接続先、KeePassで登録したurl|cs://@url|
|user|KeePassで登録したログインユーザー名|cs://@user|
|password|KeePassで登録したログインパスワード|cs://@password|
|credential_store_file|*.kdbxファイルパス|./config/demo.kdbx|
|credential_store_key_file|*.keyxファイルパス|./config/demo.keyx|
|credential_store_entry_path|KeePassで登録したフォルダーパス+エントリー名、省略した場合はcs://以降にエントリーパスを入力必要|demo/js7centos7|
|credential_store_password|KeePassデータベースのマスターパスワード|省略可|
|auth_method|SSH認証方法、publickey or password|password|
|auth_file|公開鍵ファイル名|cs://@attachment|
|command|SSH サーバ上で実行されるコマンドを指定|任意のコマンド|
|command_script|スクリプトファイルとしてリモートホストに転送され、そこで実行されるコマンドを指定|任意のコマンド|
|command_script_file|リモートホストに転送され、そこで実行されるローカルスクリプトファイルのファイル名を指定|任意のファイル名|
|command_delimiter|複数のコマンドを指定する場合の区切り文字|%%|
|proxy_host, proxy_port, proxy_user, proxy_password|踏み台サーバーのホスト、ポート、ユーザー、パスワードを指定|-|
|connect_timeout|コネクションタイムアウト秒、デフォルトは0|10|
|その他|ウイザードのドキュメント表示をクリックすると詳細説明が表示されます|-|

引数が設定されているか確認し、配置します。

![スクリーンショット 2022-06-15 11.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52445/23ab89d0-b778-2e75-76b0-a188b9bf62b9.png)

## (3) ジョブの実行
ワークフローメニューから作成したワークフローを実行します。
上記ワークフローのログ出力例
```
2022-06-15 11:06:07.375+09:00 [MAIN] [OrderStarted] id=#2022-06-15#T25876728413-root, pos=0
2022-06-15 11:06:07.480+09:00 [MAIN] [OrderProcessingStarted] id=#2022-06-15#T25876728413-root, pos=0, Job=ssh_cs, Agent(url=http://js7-agent-standalone:4445, name=primaryAgent, time=2022-06-15 11:06:07.375+09:00)
2022-06-15 11:06:07.375+09:00 [MAIN]    [Start] Job=ssh_cs, Agent (url=http://js7-agent-standalone:4445, id=js7-agent-standalone, name=primaryAgent)
2022-06-15 11:06:07.795+09:00 [STDOUT]  [INFO]Job Parameterization:
[INFO]Resulting Arguments:
[INFO]    command_script=hostname&&date (source=JOB)
[INFO]    auth_method=PASSWORD (source=JOB SSHProviderArguments)
[INFO]    host=cs://@url (source=JOB SSHProviderArguments)
[INFO]    user=cs://@user (source=JOB SSHProviderArguments)
[INFO]    password=******** (source=JOB SSHProviderArguments)
[INFO]    credential_store_file=./config/demo.kdbx (source=JOB SOSCredentialStoreArguments)
[INFO]    credential_store_key_file=./config/demo.keyx (source=JOB SOSCredentialStoreArguments)
[INFO]    credential_store_entry_path=demo/js7centos7 (source=JOB SOSCredentialStoreArguments)
2022-06-15 11:06:08.263+09:00 [STDOUT]  [INFO][connect]192.168.110.249:22 ...
2022-06-15 11:06:08.713+09:00 [STDOUT]  [INFO][connected][192.168.110.249:22]Server Identity=OpenSSH_7.4, OS=Linux, Shell=UNIX
[INFO][execute command script]hostname&&date
[INFO][tmp commandScript file locally][tmp command script file remote] [/tmp/sos-ssh-script-14589767935839188322.sh] : [./sos-ssh-script-14589767935839188322.sh]
[INFO]command: ./sos-ssh-script-14589767935839188322.sh
[INFO][stdOut]js7centos7
2022年  6月 15日 水曜日 11:06:08 JST
[INFO][exitCode]0
[INFO][disconnected]192.168.110.249:22
2022-06-15 11:06:08.714+09:00 [MAIN]    [End] [Success] returnCode=0
2022-06-15 11:06:08.818+09:00 [SUCCESS] [OrderProcessed] id=#2022-06-15#T25876728413-root, pos=0, Job=ssh_cs, Agent(time=2022-06-15 11:06:08.714+09:00), returnCode=0
2022-06-15 11:06:08.977+09:00 [MAIN] [OrderFinished] id=#2022-06-15#T25876728413-root, pos=1
```
**参考** @saitamanokusaさんがそのほかのSSH接続方法を記事にしていただいています。

https://qiita.com/saitamanokusa/items/3b0f188031dce4a58bfa

# 5. JS7 - ファイル転送からの利用

[JS7 ファイル転送機能](https://qiita.com/satoruf/items/12c26ba145586e6e3eaf)を参照