tigris-security-access-control について
Tigris オブジェクトストレージのアクセス設定と監査を支援するスキルです。アクセスキーの管理、バケットのロールと公開設定、CORS ルール、署名付き URL の安全な運用を扱います。
主な機能
- 01キーの作成・割り当て・ローテーション・失効
- 02キーのバケットとロールへの限定
- 03CORS の設定と確認
- 04バケットの公開・非公開設定
- 05署名付き URL の安全対策
- 06ストレージアクセス設定の監査
活用シーン
- 01アプリサーバーへのバケット読み書き権限の付与
- 02ブラウザーアップロード用 CORS の設定
- 03漏えいの疑いがあるアクセスキーのローテーション
- 04ストレージ認証情報とアクセス方針の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tigrisdata/ skills --skill tigris-security-access-controlインストール後、Claude Code で/tigris-security-access-controlを入力して読み込まれたか確認します。
同梱ファイルmetadata.jsonREADME.md
詳細
Tigris のセキュリティとアクセス制御
Tigris のオブジェクトストレージにおけるアクセスキー、CORS ルール、バケットの公開設定、署名付き URL のセキュリティを構成します。キーのライフサイクル管理、ロールベースのアクセス制御、セキュリティ監査について説明します。
前提条件
何よりも先に、まだ利用できない場合は Tigris CLI をインストールしてください。
tigris help || npm install -g @tigrisdata/cli
インストールが必要な場合は、ユーザーに次のように伝えてください。「Tigris のオブジェクトストレージを操作するために、Tigris CLI(@tigrisdata/cli)をインストールしています。」
クイックリファレンス
| 操作 | コマンド |
|---|---|
| キーを作成 | tigris access-keys create "my-key" |
| キーを一覧表示 | tigris access-keys list |
| バケットに割り当て | tigris access-keys assign <tid> --bucket <name> --role Editor |
| キーを失効 | tigris access-keys delete <tid> |
| CORS を設定 | tigris buckets cors set <bucket> --config cors.json |
| CORS を取得 | tigris buckets cors get <bucket> |
| CORS を削除 | tigris buckets cors delete <bucket> |
アクセスキーのライフサイクル
作成
tigris access-keys create "production-app-key"
# Output:
# Access Key ID: tid_xxx
# Secret Access Key: tsec_yyy ← shown ONLY once, save immediately
バケットに割り当て
# Editor: read + write + delete
tigris access-keys assign tid_xxx --bucket my-app-uploads --role Editor
# ReadOnly: read only
tigris access-keys assign tid_xxx --bucket my-app-uploads --role ReadOnly
| ロール | 読み取り | 書き込み | 削除 | 用途 |
|---|---|---|---|---|
Editor | はい | はい | はい | ファイルをアップロード・変更するアプリサーバー |
ReadOnly | はい | いいえ | いいえ | ファイルの読み取り・配信のみを行うサービス |
キーの範囲を必要最小限にする
用途ごとに別々のキーを作成します。
# Key for the app server (read/write to uploads bucket)
tigris access-keys create "app-server"
tigris access-keys assign tid_app --bucket app-uploads --role Editor
# Key for the CDN/read service (read-only)
tigris access-keys create "cdn-reader"
tigris access-keys assign tid_cdn --bucket app-uploads --role ReadOnly
# Key for backups (write to backup bucket only)
tigris access-keys create "backup-writer"
tigris access-keys assign tid_bak --bucket app-backups --role Editor
キーをローテーションする(ダウンタイムなし)
# 1. Create new key
tigris access-keys create "production-app-key-v2"
tigris access-keys assign tid_new --bucket my-app-uploads --role Editor
# 2. Update application environment with new key
# (deploy with new TIGRIS_STORAGE_ACCESS_KEY_ID / SECRET)
# 3. Verify app works with new key
# 4. Revoke old key
tigris access-keys delete tid_old
一覧表示と監査
# List all access keys
tigris access-keys list
# Check which buckets a key can access
tigris access-keys info tid_xxx
CORS の構成
ブラウザーからのアップロード(直接アップロード、署名付き PUT URL)には CORS が必要です。
CORS ルールを設定
tigris buckets cors set my-app-uploads --config cors.json
開発(localhost)
{
"CORSRules": [
{
"AllowedOrigins": ["http://localhost:3000", "http://localhost:5173"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag", "Content-Length"],
"MaxAgeSeconds": 3600
}
]
}
本番環境(特定のドメイン)
{
"CORSRules": [
{
"AllowedOrigins": ["https://myapp.com", "https://www.myapp.com"],
"AllowedMethods": ["GET", "PUT", "HEAD"],
"AllowedHeaders": ["Content-Type", "Content-MD5", "Content-Disposition"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 86400
}
]
}
開発環境と本番環境の併用
{
"CORSRules": [
{
"AllowedOrigins": [
"https://myapp.com",
"https://www.myapp.com",
"http://localhost:3000"
],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag", "Content-Length"],
"MaxAgeSeconds": 3600
}
]
}
制限なし(すべてのオリジン)
{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET"],
"AllowedHeaders": ["*"],
"MaxAgeSeconds": 86400
}
]
}
警告: "*" オリジンは、本当に公開されている読み取り専用コンテンツにのみ使用してください。すべてのオリジンからの PUT/DELETE を決して許可しないでください。
CORS を確認
# Check current CORS config
tigris buckets cors get my-app-uploads
# Test with curl
curl -I -H "Origin: https://myapp.com" \
-H "Access-Control-Request-Method: PUT" \
-X OPTIONS \
https://my-app-uploads.t3.storage.dev/test
パブリックバケットとプライベートバケット
| 設定 | 読み取り可能なユーザー | URL アクセス | 用途 |
|---|---|---|---|
| プライベート(デフォルト) | 認証済みリクエストのみ | 署名付き URL | ユーザーのドキュメント、機密ファイル |
| パブリック | URL を知っているすべてのユーザー | 直接 URL | 静的アセット、公開画像、CDN コンテンツ |
# Create public bucket
tigris buckets create my-public-assets --public
# Create private bucket (default)
tigris buckets create my-private-docs
署名付き URL のセキュリティ
ベストプラクティス
| パラメーター | 推奨事項 |
|---|---|
| 有効期限(ダウンロード) | ほとんどの用途で 5~60 分 |
| 有効期限(アップロード) | 5~15 分 |
| 範囲 | ファイルごとに URL を 1 つ、URL ごとに操作を 1 つ |
import { getPresignedUrl } from "@tigrisdata/storage";
// Short-lived download URL
const { data } = await getPresignedUrl("documents/report.pdf", {
operation: "get",
expiresIn: 300, // 5 minutes
});
// Short-lived upload URL with content type restriction
const { data } = await getPresignedUrl("uploads/photo.jpg", {
operation: "put",
expiresIn: 600,
contentType: "image/jpeg", // Client must upload this type
});
絶対にしないこと
- 有効期限を 24 時間より長く設定する
- バケットのプレフィックス全体に対して署名付き URL を生成する
- 署名付き URL を公開チャンネルで共有する(秘密情報です)
- 署名付き URL を恒久的なリンクとして使用する(代わりにパブリックバケットの URL を使用してください)
環境変数のセキュリティ
# .env (never commit this file)
TIGRIS_STORAGE_ACCESS_KEY_ID=tid_xxx
TIGRIS_STORAGE_SECRET_ACCESS_KEY=tsec_yyy
# .gitignore (must include)
.env
.env.local
.env.*.local
CI/CD では、各プラットフォームのシークレット管理機能を使用してください。
# GitHub Actions
gh secret set TIGRIS_STORAGE_ACCESS_KEY_ID
gh secret set TIGRIS_STORAGE_SECRET_ACCESS_KEY
# Vercel
vercel env add TIGRIS_STORAGE_ACCESS_KEY_ID
# Fly.io
fly secrets set TIGRIS_STORAGE_ACCESS_KEY_ID=tid_xxx
セキュリティ監査チェックリスト
- コードにキーを含めない — リポジトリ内で
tid_とtsec_を検索する -
.envを.gitignoreに追加 — 認証情報を決してコミットしない - キーの対象をバケットに限定 — グローバルアクセス権を持つ未割り当てのキーがない
- 必要に合ったロールを使用 — 読み取り専用サービスには
ReadOnlyロールを使用する - CORS を過度に許可しない — 書き込みメソッドで
"*"オリジンを使用しない - 署名付き URL の有効期限を短くする — ほとんどの場合、1 時間未満にする
- 未使用のキーを失効させる — 元チームメンバーや古いデプロイメントのキーを残さない
- 環境ごとに別のキーを使用 — 開発/ステージング/本番環境で異なるキーを使う
キーが漏えいした場合の対応
アクセスキーが公開された場合(Git にコミットした、ログから漏えいしたなど):
# 1. Immediately revoke the compromised key
tigris access-keys delete tid_compromised
# 2. Create a new key
tigris access-keys create "replacement-key"
tigris access-keys assign tid_new --bucket my-bucket --role Editor
# 3. Update all deployments with the new key
# (update .env, CI/CD secrets, deployment configs)
# 4. Audit access — check for unauthorized uploads/downloads
tigris ls t3://my-bucket --recursive -l | sort -k4 -r | head -50
# 5. If key was committed to git, rotate and consider the entire
# git history compromised — use git-filter-repo to remove it
重要なルール
必ず実施してください: 環境と用途ごとに個別のキーを作成する | 必要最小限のロールを指定してキーを特定のバケットに割り当てる | キーを定期的にローテーションする(四半期ごとを推奨) | 本番環境では CORS のオリジンを個別に指定する | 有効期間の短い署名付き URL を使用する
絶対にしないでください: キーを Git にコミットする | すべての環境で単一のキーを使用する | 書き込みメソッドで CORS を "*" に設定する | 署名付き URL を公開する | 使用していないキーを有効なままにする
既知の問題
| 問題 | 対処方法 |
|---|---|
| CORS のプリフライトリクエストが失敗する | AllowedOrigins に正確なオリジン(プロトコルを含む)が指定されていることを確認してください |
| キーのローテーション後に「アクセスが拒否されました」と表示される | 新しいキーが正しいロールでバケットに割り当てられていることを確認してください |
| シークレットキーを紛失した | 復元できません。新しいキーを作成して再割り当てしてください |
| ブラウザーからのアップロードが無言で失敗する | CORS の設定で AllowedMethods に PUT が含まれていることを確認してください |
関連スキル
- file-storage — CLI のセットアップとアクセスキーの作成
- tigris-s3-migration — 移行時の CORS と認証情報のセットアップ