Agent skill

system-configuration

システム設定(System Configuration)機能の開発・修正を行う際に使用。SSRF保護、Trusted Proxies、HTTPセキュリティ実装時に役立つ。

Stars 163
Forks 31

Install this agent skill to your Project

npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/system-configuration

SKILL.md

システム設定(System Configuration)開発ガイド

ドキュメント

  • documentation/docs/content_03_concepts/06-security-extensions/concept-04-system-configuration.md - システム設定概念
  • documentation/docs/content_06_developer-guide/05-configuration/system-configuration.md - システム設定ガイド

機能概要

システム設定は、プラットフォーム全体のセキュリティ設定を管理する層。

  • SSRF保護: Server-Side Request Forgery攻撃防止
  • Trusted Proxies: X-Forwarded-Forヘッダー信頼設定
  • プライベートIPブロック: 内部ネットワークへのアクセス防止
  • Allowlist検証: OWASP推奨のホワイトリスト方式

モジュール構成

libs/
├── idp-server-platform/                     # プラットフォーム基盤
│   └── .../platform/
│       ├── security/ssrf/
│       │   ├── SsrfProtectionValidator.java  # SSRF保護
│       │   └── PrivateIpRange.java           # プライベートIP定義
│       ├── system/
│       │   ├── SystemConfiguration.java
│       │   └── config/
│       │       ├── SsrfProtectionConfig.java
│       │       └── TrustedProxyConfig.java
│       └── http/
│           └── SsrfProtectedHttpClient.java
│
└── idp-server-springboot-adapter/           # Spring Boot統合
    └── .../adapters/springboot/
        └── TrustedProxyFilter.java          # Proxyフィルター

SSRF保護

idp-server-platform/security/ssrf/SsrfProtectionValidator.java 内の実際の実装:

java
/**
 * SSRF攻撃を防ぐURLとIPアドレスの検証
 *
 * OWASP推奨の防御施策:
 * - プライベート/内部IPレンジへのリクエストをブロック
 * - クラウドメタデータサービスへのアクセスをブロック
 * - HTTP/HTTPSスキームのみ許可
 * - DNS解決後のIPアドレスを検証
 */
public class SsrfProtectionValidator {

    private final Set<PrivateIpRange> blockedRanges;
    private final Set<String> bypassHosts;

    /** 全プライベートIPレンジをブロックするValidator */
    public SsrfProtectionValidator() {
        this.blockedRanges = EnumSet.allOf(PrivateIpRange.class);
        this.bypassHosts = Collections.emptySet();
    }

    /**
     * 開発用: バイパスホストを設定
     * localhost, mock-service等を許可
     */
    public static SsrfProtectionValidator withBypassHosts(
        Set<String> bypassHosts
    ) {
        return new SsrfProtectionValidator(
            EnumSet.allOf(PrivateIpRange.class),
            bypassHosts
        );
    }

    /**
     * URI検証
     */
    public void validate(URI targetUri) {
        // スキーム検証(HTTP/HTTPSのみ)
        // DNS解決
        // IPアドレス検証(プライベートIPブロック)
    }

    /**
     * Allowlist検証(OWASP推奨)
     */
    public void validateWithAllowlist(
        URI targetUri,
        Set<String> allowedHosts
    ) {
        // ホストがAllowlistに含まれるか確認
        // SSRF保護も併用
    }
}

PrivateIpRange(ブロック対象)

java
public enum PrivateIpRange {
    PRIVATE_10,      // 10.0.0.0/8
    PRIVATE_172,     // 172.16.0.0/12
    PRIVATE_192,     // 192.168.0.0/16
    LOOPBACK,        // 127.0.0.0/8
    LINK_LOCAL,      // 169.254.0.0/16
    CLOUD_METADATA;  // クラウドメタデータサービス
}

Trusted Proxies

idp-server-springboot-adapter/TrustedProxyFilter.java 内の実際の実装:

java
/**
 * Trusted Proxyからの実クライアントIP解決
 *
 * リバースプロキシ・ロードバランサー背後で動作する際、
 * X-Forwarded-Forヘッダーから実クライアントIPを抽出
 *
 * セキュリティ:
 * - X-Forwarded-Forは偽装可能
 * - Trusted Proxy設定が有効な場合のみ信頼
 * - リクエストのremote addressがTrusted Proxyと一致する場合のみ
 */
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class TrustedProxyFilter extends OncePerRequestFilter {

    public static final String RESOLVED_CLIENT_IP_ATTRIBUTE =
        "resolvedClientIp";

    @Override
    protected void doFilterInternal(
        HttpServletRequest request,
        HttpServletResponse response,
        FilterChain filterChain
    ) throws ServletException, IOException {

        String resolvedIp = resolveClientIp(request);
        request.setAttribute(RESOLVED_CLIENT_IP_ATTRIBUTE, resolvedIp);

        filterChain.doFilter(request, response);
    }

    /**
     * 実クライアントIP解決
     *
     * Trusted ProxyからのリクエストでX-Forwarded-Forヘッダーが
     * 存在する場合、最初のIPを抽出(元のクライアント)
     * それ以外はremote addressを返却
     */
    private String resolveClientIp(HttpServletRequest request) {
        String remoteAddr = request.getRemoteAddr();

        TrustedProxyConfig config = systemConfig.trustedProxies();

        if (!config.isEnabled()) {
            return remoteAddr;
        }

        if (!config.isTrustedProxy(remoteAddr)) {
            return remoteAddr;
        }

        // X-Forwarded-Forから実IPを抽出
        // ...
    }
}

システム設定

idp-server-platform/system/ 内:

java
public class SystemConfiguration {
    SsrfProtectionConfig ssrfProtection;
    TrustedProxyConfig trustedProxies;

    public SsrfProtectionConfig ssrfProtection() {
        return ssrfProtection;
    }

    public TrustedProxyConfig trustedProxies() {
        return trustedProxies;
    }
}

SSRF保護設定

java
public class SsrfProtectionConfig {
    boolean enabled;
    Set<String> bypassHosts;      // 開発用バイパス
    Set<String> allowedHosts;     // Allowlist(OWASP推奨)
}

Trusted Proxy設定

java
public class TrustedProxyConfig {
    boolean enabled;
    List<String> trustedProxyCidrs;  // CIDR形式(例: 10.0.0.0/8)

    public boolean isTrustedProxy(String ipAddress) {
        // IPアドレスがTrusted Proxy CIDRに含まれるか確認
    }
}

E2Eテスト

e2e/src/tests/
└── (システム設定関連テストは各機能のセキュリティテスト内で検証)

コマンド

bash
# ビルド
./gradlew :libs:idp-server-platform:compileJava

# テスト
cd e2e && npm test

トラブルシューティング

SSRF保護でブロックされる

  • 開発環境: bypassHostsにlocalhost, mock-serviceを追加
  • 本番環境: allowedHostsを設定(OWASP推奨)

クラウドメタデータサービスへのアクセス

  • 169.254.169.254はデフォルトでブロック
  • AWS/GCP/Azureメタデータサービスへのアクセスは禁止

Trusted Proxy設定が動作しない

  • TrustedProxyConfig.enabledがtrueか確認
  • リクエストのremote addressがtrustedProxyCidrsに含まれるか確認
  • CIDR形式が正しいか確認(例: 10.0.0.0/8)

X-Forwarded-Forが信頼されない

  • Trusted Proxyからのリクエストか確認
  • TrustedProxyFilterが動作しているか確認
  • request.getAttribute("resolvedClientIp")でIPを取得

Didn't find tool you were looking for?

Be as detailed as possible for better results