mcpField
T
tigris-security-access-control

tigris-security-access-control

github.com/tigrisdataセキュリティ23.3k 回インストール14 週間前に更新
リポジトリ

tigris-security-access-control について

Tigris オブジェクトストレージのアクセス設定と監査を支援するスキルです。アクセスキーの管理、バケットのロールと公開設定、CORS ルール、署名付き URL の安全な運用を扱います。

主な機能

  1. 01キーの作成・割り当て・ローテーション・失効
  2. 02キーのバケットとロールへの限定
  3. 03CORS の設定と確認
  4. 04バケットの公開・非公開設定
  5. 05署名付き URL の安全対策
  6. 06ストレージアクセス設定の監査

活用シーン

  1. 01アプリサーバーへのバケット読み書き権限の付与
  2. 02ブラウザーアップロード用 CORS の設定
  3. 03漏えいの疑いがあるアクセスキーのローテーション
  4. 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 と認証情報のセットアップ

公式ドキュメント

コメント