senhasegura-skill について
senhaseguraの特権アクセス管理プラットフォームを統合するための実践ガイドです。認証、API、SDK、CLIに加え、シークレット、認証情報、SSHキー、CI/CD、Kubernetesの運用手順を扱います。
主な機能
- 01OAuth 2.0とAPIの設定
- 02認証情報とSSHキーの管理
- 03DSM CLIによるシークレット注入
- 04Kubernetesへのシークレット同期
- 05Python SDKの例
- 06CI/CD統合ワークフロー
活用シーン
- 01A2A API経由での認証情報取得
- 02CI/CDパイプラインへのシークレット注入
- 03Kubernetesとのシークレット同期
- 04SSHキーのローテーション自動化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ julianobarbosa/ claude-code-skills --skill senhasegura-skillインストール後、Claude Code で/senhasegura-skillを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
samples/ci-cd/azure-pipelines.yamlgithub-actions.yamlgitlab-ci.yamlsamples/config/dsm-config.yamlmapping.jsonsamples/kubernetes/externalsecret.yamlsecretstore.yamlsamples/python/senhasegura_client.pysamples/typescript/senhasegura-client.tstools/mcp-integration.mdworkflows/WORKFLOWS.md詳細
Senhasegura PAM Platform Skill
senhasegura(Segura)Privileged Access Management プラットフォームとの統合に関する包括的なガイドです。A2A API、DevOps Secrets Management(DSM)、MySafe、認証情報管理、SSH キーのローテーション、Kubernetes との統合について説明します。
プラットフォームの概要
コアモジュール
| モジュール | 目的 | ユースケース |
|---|---|---|
| PAM Core | 認証情報の保管、パスワードのローテーション、セッション管理 | エンタープライズの認証情報管理 |
| A2A | アプリケーション間の API 認証 | プログラムによるシークレットへのアクセス |
| DSM | CI/CD パイプライン向け DevOps Secret Manager | パイプラインへのシークレットの注入 |
| MySafe | 個人/チーム向けパスワードマネージャー | 社内での認証情報の共有 |
| Executions | パスワードの自動ローテーション、スクリプトの実行 | スケジュールに基づく認証情報の変更 |
| SCIM | ID のプロビジョニングと管理 | IdP とのユーザー同期 |
認証方法
| 方法 | ユースケース | セキュリティレベル |
|---|---|---|
| OAuth 2.0 | すべての統合で推奨 | 高(推奨) |
| OAuth 1.0 | レガシーサポート | 中 |
| AWS Signature | AWS ワークロード | 高 |
認証の設定
OAuth 2.0 の設定(推奨)
手順 1:A2A アプリケーションを作成する
senhasegura Console:
1. Navigate to: A2A > Applications
2. Click: + New Application
3. Configure:
- Name: my-app-integration
- Authentication: OAuth 2.0
- Enabled: Yes
4. Save and note the Client ID
手順 2:認証情報を取得する
After saving:
1. Go to: A2A > Applications > [your-app]
2. Click: Authorization > View
3. Copy:
- client_id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- client_secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
手順 3:アクセストークンをリクエストする
# OAuth 2.0 Token Request
curl -X POST "https://senhasegura.example.com/iso/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"
レスポンス:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR...",
"token_type": "Bearer",
"expires_in": 3600
}
手順 4:API 呼び出しでトークンを使用する
curl -X GET "https://senhasegura.example.com/api/pam/credential" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
PAM Core API リファレンス
認証情報エンドポイント
| メソッド | エンドポイント | 説明 |
|---|---|---|
GET | /api/pam/credential | すべての認証情報を一覧表示 |
GET | /api/pam/credential/{id} | ID で認証情報を取得 |
POST | /api/pam/credential | 新しい認証情報を作成 |
PUT | /api/pam/credential/{id} | 認証情報を更新 |
DELETE | /api/pam/credential/{id} | 認証情報を無効化 |
DELETE | /iso/pam/credential/custody/{id} | 認証情報の預かりを解除 |
すべての認証情報を一覧表示する
curl -X GET "https://senhasegura.example.com/api/pam/credential" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json"
レスポンス:
{
"response": {
"status": 200,
"message": "Credentials found",
"error": false,
"error_code": 0,
"credentials": [
{
"id": "123",
"identifier": "db-admin-prod",
"username": "admin",
"hostname": "db.example.com",
"ip": "10.0.1.50",
"type": "Local User"
}
]
}
}
認証情報のパスワードを取得する
# Legacy endpoint for password retrieval
curl -X GET "https://senhasegura.example.com/iso/coe/senha" \
-H "Authorization: Bearer $TOKEN" \
-d "credentialId=123"
レスポンス:
{
"response": {
"status": 200,
"credential": {
"id": "123",
"password": "S3cur3P@ssw0rd!",
"expiration": "2024-12-31T23:59:59Z"
}
}
}
認証情報を作成する
curl -X POST "https://senhasegura.example.com/api/pam/credential" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"identifier": "new-service-account",
"username": "svc_app",
"password": "InitialP@ss123",
"hostname": "app-server.example.com",
"ip": "10.0.2.100",
"type": "Local User",
"additional_info": "Service account for app",
"tags": ["production", "critical"]
}'
認証情報の預かりを解除する
# After API password request, release custody
curl -X DELETE "https://senhasegura.example.com/iso/pam/credential/custody/123" \
-H "Authorization: Bearer $TOKEN"
SSH キー API
エンドポイント
| メソッド | エンドポイント | 説明 |
|---|---|---|
GET | /api/pam/sshkey | すべての SSH キーを一覧表示 |
GET | /api/pam/sshkey/{id} | ID で SSH キーを取得 |
POST | /api/pam/sshkey | 新しい SSH キーを登録 |
PUT | /api/pam/sshkey/{id} | SSH キーを更新 |
POST | /api/pam/sshkey/{id}/rotate | キーのローテーションを開始 |
SSH キーを登録する
curl -X POST "https://senhasegura.example.com/api/pam/sshkey" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"identifier": "deploy-key-prod",
"username": "deploy",
"hostname": "*.prod.example.com",
"public_key": "ssh-ed25519 AAAAC3Nza...",
"private_key": "-----BEGIN OPENSSH PRIVATE KEY-----...",
"passphrase": "optional-passphrase",
"auto_rotate": true,
"rotation_days": 90
}'
キーのローテーションを開始する
curl -X POST "https://senhasegura.example.com/api/pam/sshkey/456/rotate" \
-H "Authorization: Bearer $TOKEN"
DevOps Secret Manager(DSM)
DSM CLI のインストール
# Download latest binary
curl -LO https://github.com/senhasegura/dsmcli/releases/latest/download/dsm-linux-amd64
chmod +x dsm-linux-amd64
sudo mv dsm-linux-amd64 /usr/local/bin/dsm
# Verify installation
dsm --version
DSM CLI の設定
~/.senhasegura/config.yaml を作成します。
# Required
SENHASEGURA_URL: "https://senhasegura.example.com"
SENHASEGURA_CLIENT_ID: "your-client-id"
SENHASEGURA_CLIENT_SECRET: "your-client-secret"
# Optional
SENHASEGURA_MAPPING_FILE: "/path/to/mapping.json"
SENHASEGURA_SECRETS_FILE: ".runb.vars"
SENHASEGURA_DISABLE_RUNB: 0
環境変数(代替方法)
export SENHASEGURA_URL="https://senhasegura.example.com"
export SENHASEGURA_CLIENT_ID="your-client-id"
export SENHASEGURA_CLIENT_SECRET="your-client-secret"
export SENHASEGURA_CONFIG_FILE="/path/to/config.yaml"
Belt の実行(runb)- シークレットの注入
# Fetch secrets and create environment file
dsm runb \
--application "my-application" \
--system "production" \
--environment "prod" \
--config ~/.senhasegura/config.yaml
# Source the secrets
source .runb.vars
# Use in your application
echo "Database password: $DB_PASSWORD"
# Clean up after use (IMPORTANT)
rm -f .runb.vars
CI/CD ツールとの統合
# GitHub Actions
dsm runb --tool-name github --application myapp --system prod --environment prod
# Azure DevOps
dsm runb --tool-name azure-devops --application myapp --system prod --environment prod
# GitLab CI
dsm runb --tool-name gitlab --application myapp --system prod --environment prod
# Jenkins
dsm runb --tool-name linux --application myapp --system prod --environment prod
シークレット登録用のマッピングファイル
CI/CD からシークレットを登録/更新するために mapping.json を作成します。
{
"access_keys": [
{
"name": "AWS_PROD_KEYS",
"type": "aws",
"fields": {
"access_key_id": "AWS_ACCESS_KEY_ID",
"secret_access_key": "AWS_SECRET_ACCESS_KEY"
}
}
],
"credentials": [
{
"name": "DATABASE_CREDS",
"fields": {
"user": "DB_USER",
"password": "DB_PASSWORD",
"host": "DB_HOST"
}
}
],
"key_value": [
{
"name": "API_TOKENS",
"fields": ["API_KEY", "API_SECRET", "WEBHOOK_SECRET"]
}
]
}
DSM API エンドポイント
| メソッド | エンドポイント | 説明 |
|---|---|---|
GET | /api/dsm/secret | シークレットを一覧表示 |
GET | /api/dsm/secret/{identifier} | 識別子でシークレットを取得 |
POST | /api/dsm/secret | シークレットを作成 |
PUT | /api/dsm/secret/{identifier} | シークレットを更新 |
DELETE | /api/dsm/secret/{identifier} | シークレットを削除 |
Kubernetes との統合
External Secrets Operator のセットアップ
ESO をインストールする
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
-n external-secrets --create-namespace
認証シークレットを作成する
apiVersion: v1
kind: Secret
metadata:
name: senhasegura-auth
namespace: external-secrets
type: Opaque
stringData:
clientId: "your-oauth2-client-id"
clientSecret: "your-oauth2-client-secret"
SecretStore を設定する
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: senhasegura-dsm
namespace: default
spec:
provider:
senhasegura:
url: "https://senhasegura.example.com"
module: DSM
auth:
clientId:
secretRef:
name: senhasegura-auth
key: clientId
namespace: external-secrets
clientSecretSecretRef:
name: senhasegura-auth
key: clientSecret
namespace: external-secrets
# Optional: skip TLS verification (not recommended for production)
# ignoreSslCertificate: true
ClusterSecretStore(複数の名前空間)
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: senhasegura-dsm-global
spec:
provider:
senhasegura:
url: "https://senhasegura.example.com"
module: DSM
auth:
clientId:
secretRef:
name: senhasegura-auth
key: clientId
namespace: external-secrets
clientSecretSecretRef:
name: senhasegura-auth
key: clientSecret
namespace: external-secrets
ExternalSecret - キーを明示的に指定
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
namespace: default
spec:
refreshInterval: 1h
secretStoreRef:
name: senhasegura-dsm
kind: SecretStore
target:
name: db-secret
creationPolicy: Owner
data:
- secretKey: username
remoteRef:
key: database-prod
property: username
- secretKey: password
remoteRef:
key: database-prod
property: password
- secretKey: host
remoteRef:
key: database-prod
property: host
ExternalSecret - すべてのフィールドを抽出
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: api-secrets
namespace: default
spec:
refreshInterval: 30m
secretStoreRef:
name: senhasegura-dsm
kind: SecretStore
target:
name: api-config
creationPolicy: Owner
dataFrom:
- extract:
key: api-settings-prod
MySafe との統合
MySafe の機能
- パスワード:ログイン認証情報を保存、共有
- メモ:テキストメモを安全に保存
- ファイル:ファイルを暗号化して保存
- API シークレット:API キー、トークン、クライアント認証情報を保存
Web アクセス
URL: https://senhasegura.example.com/mysafe
Features:
- Central vault administration
- Credential creation and management
- Sharing with internal/external users
- Access history and auditing
ブラウザー拡張機能
Chrome: Segura MySafe Extension
Features:
- Auto-fill passwords
- Create new credentials
- Quick access to notes
アイテムの共有
Sharing Options:
1. Internal sharing (MySafe users)
- Select users/groups
- Set permissions (view/edit)
2. External sharing (temporary)
- Generate unique link
- Set expiration time
- Limit number of views
- Revoke access anytime
Python SDK 統合
インストール
pip install senhasegura
基本的な使い方
from senhasegura import A2A
# Initialize with OAuth 2.0 (recommended)
client = A2A(
base_url="https://senhasegura.example.com",
client_id="your-client-id",
client_secret="your-client-secret",
auth_method="oauth2" # or "oauth1"
)
# Get credential password
response = client.get(
"/iso/coe/senha",
params={"credentialId": 123}
)
password = response.json()["response"]["credential"]["password"]
# List all credentials
credentials = client.get("/api/pam/credential")
for cred in credentials.json()["response"]["credentials"]:
print(f"{cred['identifier']}: {cred['username']}@{cred['hostname']}")
# Create new credential
new_cred = client.post(
"/api/pam/credential",
json={
"identifier": "new-service",
"username": "svc_user",
"password": "SecurePass123!",
"hostname": "server.example.com"
}
)
# Release credential custody
client.delete(f"/iso/pam/credential/custody/{credential_id}")
OAuth 1.0(レガシー)
from senhasegura import A2A
client = A2A(
base_url="https://senhasegura.example.com",
consumer_key="your-consumer-key",
consumer_secret="your-consumer-secret",
token_key="your-token-key",
token_secret="your-token-secret",
auth_method="oauth1"
)
エラー処理
from senhasegura import A2A
from senhasegura.exceptions import AuthenticationError, APIError
try:
client = A2A(
base_url="https://senhasegura.example.com",
client_id="client-id",
client_secret="client-secret"
)
response = client.get("/api/pam/credential/999")
response.raise_for_status()
except AuthenticationError as e:
print(f"Authentication failed: {e}")
except APIError as e:
print(f"API error: {e.status_code} - {e.message}")
CI/CD パイプラインの例
GitHub Actions
name: Deploy with Secrets
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install DSM CLI
run: |
curl -LO https://github.com/senhasegura/dsmcli/releases/latest/download/dsm-linux-amd64
chmod +x dsm-linux-amd64
sudo mv dsm-linux-amd64 /usr/local/bin/dsm
- name: Fetch Secrets
env:
SENHASEGURA_URL: ${{ secrets.SENHASEGURA_URL }}
SENHASEGURA_CLIENT_ID: ${{ secrets.SENHASEGURA_CLIENT_ID }}
SENHASEGURA_CLIENT_SECRET: ${{ secrets.SENHASEGURA_CLIENT_SECRET }}
run: |
dsm runb \
--tool-name github \
--application my-app \
--system production \
--environment prod
source .runb.vars
- name: Deploy
run: |
# Secrets are now available as environment variables
./deploy.sh
- name: Cleanup
if: always()
run: rm -f .runb.vars
Azure DevOps パイプライン
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- script: |
curl -LO https://github.com/senhasegura/dsmcli/releases/latest/download/dsm-linux-amd64
chmod +x dsm-linux-amd64
sudo mv dsm-linux-amd64 /usr/local/bin/dsm
displayName: Install DSM CLI
- script: |
dsm runb \
--tool-name azure-devops \
--application $(APPLICATION_NAME) \
--system $(SYSTEM_NAME) \
--environment $(ENVIRONMENT)
displayName: Fetch Secrets
env:
SENHASEGURA_URL: $(SENHASEGURA_URL)
SENHASEGURA_CLIENT_ID: $(SENHASEGURA_CLIENT_ID)
SENHASEGURA_CLIENT_SECRET: $(SENHASEGURA_CLIENT_SECRET)
- script: |
source .runb.vars
./deploy.sh
displayName: Deploy Application
- script: rm -f .runb.vars
displayName: Cleanup
condition: always()
GitLab CI
stages:
- deploy
deploy:
stage: deploy
image: ubuntu:latest
before_script:
- apt-get update && apt-get install -y curl
- curl -LO https://github.com/senhasegura/dsmcli/releases/latest/download/dsm-linux-amd64
- chmod +x dsm-linux-amd64 && mv dsm-linux-amd64 /usr/local/bin/dsm
script:
- |
dsm runb \
--tool-name gitlab \
--application $APPLICATION_NAME \
--system $SYSTEM_NAME \
--environment $CI_ENVIRONMENT_NAME
- source .runb.vars
- ./deploy.sh
after_script:
- rm -f .runb.vars
variables:
SENHASEGURA_URL: $SENHASEGURA_URL
SENHASEGURA_CLIENT_ID: $SENHASEGURA_CLIENT_ID
SENHASEGURA_CLIENT_SECRET: $SENHASEGURA_CLIENT_SECRET
ワークフロー
ワークフロー 1:A2A の初期設定
1. Create Application
Console: A2A > Applications > New
- Name: app-integration
- Authentication: OAuth 2.0
- Status: Enabled
2. Configure Authorization
Console: A2A > Authorizations > New
- Application: app-integration
- Module: PAM Core (or DSM)
- Permission: Read/Write
- IP Restriction: 10.0.0.0/8 (optional)
- Credential filter: tag:production (optional)
3. Test Authentication
curl -X POST "$URL/iso/oauth2/token" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET"
4. Verify Access
curl -X GET "$URL/api/pam/credential" \
-H "Authorization: Bearer $TOKEN"
ワークフロー 2:Kubernetes シークレットの同期
1. Install External Secrets Operator
helm install external-secrets external-secrets/external-secrets
2. Create Auth Secret
kubectl create secret generic senhasegura-auth \
--from-literal=clientId=xxx \
--from-literal=clientSecret=xxx
3. Create SecretStore
kubectl apply -f secretstore.yaml
4. Create ExternalSecret
kubectl apply -f externalsecret.yaml
5. Verify Sync
kubectl get externalsecret
kubectl get secret db-secret -o yaml
ワークフロー 3:パスワードローテーションの自動化
1. Configure Execution Template
Console: Executions > Templates
- Template: Linux Password Change
- Commands: passwd, chage
- Verification: SSH login test
2. Create Execution Policy
Console: Executions > Policies
- Credentials: tag:linux-servers
- Schedule: Every 30 days
- Template: Linux Password Change
- Notification: [email protected]
3. Monitor Executions
Console: Executions > History
- Filter by date/status
- Review logs
- Handle failures
セキュリティのベストプラクティス
認証情報の管理
DO:
- Use one credential per A2A authorization
- Apply IP restrictions to authorized networks only
- Enable automatic password rotation
- Use unique identifiers for credentials
- Audit access logs regularly
DON'T:
- Share A2A credentials across applications
- Disable IP restrictions in production
- Store credentials in source code
- Use weak or default passwords
- Ignore failed authentication alerts
API セキュリティ
# Good: Use environment variables
import os
client = A2A(
base_url=os.environ["SENHASEGURA_URL"],
client_id=os.environ["SENHASEGURA_CLIENT_ID"],
client_secret=os.environ["SENHASEGURA_CLIENT_SECRET"]
)
# Good: Release custody after use
try:
password = client.get_password(credential_id)
# Use password
finally:
client.release_custody(credential_id)
Kubernetes のセキュリティ
# Use namespaced SecretStore when possible
apiVersion: external-secrets.io/v1beta1
kind: SecretStore # Not ClusterSecretStore
metadata:
name: app-secrets
namespace: my-app # Limit scope
spec:
provider:
senhasegura:
# ...
---
# Restrict RBAC
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
namespace: my-app
rules:
- apiGroups: [""]
resources: ["secrets"]
resourceNames: ["db-secret", "api-secret"] # Specific secrets only
verbs: ["get"]
トラブルシューティング
認証エラー
| エラー | 原因 | 解決策 |
|---|---|---|
401 Unauthorized | 無効または期限切れのトークン | 新しいアクセストークンをリクエストします |
403 Forbidden | 権限が不足しています | A2A の認可を確認します |
invalid_client | client_id または secret が間違っています | Console で認証情報を確認します |
IP not allowed | IP 制限 | 送信元 IP を許可リストに追加します |
DSM CLI の問題
# Debug mode
dsm runb --debug \
--application myapp \
--system prod \
--environment prod
# Common fixes
# 1. Config file not found
export SENHASEGURA_CONFIG_FILE=/absolute/path/to/config.yaml
# 2. SSL certificate errors
# Add to config.yaml:
# SENHASEGURA_INSECURE: true # Not recommended for production
# 3. Permission denied
chmod 600 ~/.senhasegura/config.yaml
External Secrets Operator
# Check SecretStore status
kubectl describe secretstore senhasegura-dsm
# Check ExternalSecret status
kubectl describe externalsecret database-credentials
# View ESO logs
kubectl logs -n external-secrets -l app.kubernetes.io/name=external-secrets
# Common issues:
# - "could not get provider client": Check auth secret
# - "could not find secret": Verify secret identifier in DSM
# - "refresh failed": Check network/firewall to senhasegura
API レスポンスコード
| コード | 意味 | 対応 |
|---|---|---|
200 | 成功 | レスポンスを処理します |
400 | 不正なリクエスト | リクエスト形式を確認します |
401 | 認証されていません | 再認証します |
403 | 禁止されています | 権限を確認します |
404 | 見つかりません | リソース ID を確認します |
429 | レート制限されています | バックオフを実装します |
500 | サーバーエラー | サポートにお問い合わせください |
クイックリファレンス
環境変数
# Core Authentication
SENHASEGURA_URL="https://senhasegura.example.com"
SENHASEGURA_CLIENT_ID="oauth2-client-id"
SENHASEGURA_CLIENT_SECRET="oauth2-client-secret"
# DSM CLI
SENHASEGURA_CONFIG_FILE="/path/to/config.yaml"
SENHASEGURA_MAPPING_FILE="/path/to/mapping.json"
SENHASEGURA_SECRETS_FILE=".runb.vars"
# Optional
SENHASEGURA_INSECURE="false" # Skip TLS verify
SENHASEGURA_TIMEOUT="30" # Request timeout
一般的な API パターン
# Get token
TOKEN=$(curl -s -X POST "$URL/iso/oauth2/token" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET" | jq -r '.access_token')
# List credentials
curl -H "Authorization: Bearer $TOKEN" "$URL/api/pam/credential"
# Get password
curl -H "Authorization: Bearer $TOKEN" "$URL/iso/coe/senha?credentialId=123"
# Release custody
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
"$URL/iso/pam/credential/custody/123"
ドキュメントへのリンク
コメント
Markdown 対応