SiamCafe.net Blog
Technology

SonarQube Analysis Identity Access Management

sonarqube analysis identity access management
SonarQube Analysis Identity Access Management | SiamCafe Blog
2025-06-13· อ. บอม — SiamCafe.net· 9,499 คำ

SonarQube IAM Analysis

SonarQube Analysis Identity Access Management Code Quality Security SAST Bug Vulnerability Quality Gate CI/CD IAM Authentication Authorization

CheckIAM CategorySeverityExample
Hardcoded CredentialsAuthenticationCriticalpassword = "admin123" in code
Weak HashingAuthenticationCriticalMD5/SHA1 for password storage
Missing Auth CheckAuthorizationCriticalEndpoint without @Authorize
SQL InjectionInput ValidationCriticalString concat in SQL query
Insecure CookieSessionHighMissing HttpOnly Secure flags
JWT None AlgorithmTokenCriticalAccepting alg: none in JWT

SonarQube Setup

# === SonarQube for IAM Projects ===

# Docker Setup
# docker run -d --name sonarqube \
#   -p 9000:9000 \
#   -v sonarqube_data:/opt/sonarqube/data \
#   -v sonarqube_logs:/opt/sonarqube/logs \
#   sonarqube:community
#
# sonar-project.properties
# sonar.projectKey=iam-service
# sonar.projectName=IAM Service
# sonar.sources=src
# sonar.tests=tests
# sonar.language=java
# sonar.java.binaries=target/classes
# sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
# sonar.qualitygate.wait=true
#
# Run Scanner
# sonar-scanner \
#   -Dsonar.host.url=http://localhost:9000 \
#   -Dsonar.token=sqp_xxxxx

from dataclasses import dataclass

@dataclass
class SecurityRule:
    rule_id: str
    category: str
    description: str
    severity: str
    fix: str

rules = [
    SecurityRule("S2068",
        "Authentication",
        "Hardcoded Credentials: Password API Key ใน Source Code",
        "Blocker",
        "ใช้ Environment Variable หรือ Secret Manager"),
    SecurityRule("S4790",
        "Authentication",
        "Weak Hashing: MD5 SHA1 สำหรับ Password",
        "Critical",
        "ใช้ bcrypt scrypt Argon2id"),
    SecurityRule("S3330",
        "Session",
        "Insecure Cookie: ไม่มี HttpOnly Secure Flag",
        "Major",
        "ตั้ง HttpOnly=true Secure=true SameSite=Strict"),
    SecurityRule("S5131",
        "Input Validation",
        "SQL Injection: String Concatenation ใน Query",
        "Blocker",
        "ใช้ Parameterized Query / Prepared Statement"),
    SecurityRule("S5659",
        "Token",
        "JWT: ไม่ตรวจ Signature หรือยอมรับ alg:none",
        "Blocker",
        "Verify Signature ทุกครั้ง Reject alg:none"),
    SecurityRule("S4502",
        "Authorization",
        "Missing CSRF Protection ใน State-changing Endpoint",
        "Critical",
        "เพิ่ม CSRF Token ทุก POST PUT DELETE"),
]

print("=== IAM Security Rules ===")
for r in rules:
    print(f"  [{r.rule_id}] {r.category} | Severity: {r.severity}")
    print(f"    Desc: {r.description}")
    print(f"    Fix: {r.fix}")

Quality Gate

# === IAM Quality Gate Configuration ===

# SonarQube API: Create Custom Quality Gate
# POST /api/qualitygates/create
# { "name": "IAM Strict Gate" }
#
# Add Conditions:
# POST /api/qualitygates/create_condition
# { "gateId": 1, "metric": "new_coverage", "op": "LT", "error": "90" }
# { "gateId": 1, "metric": "new_duplicated_lines_density", "op": "GT", "error": "1" }
# { "gateId": 1, "metric": "new_bugs", "op": "GT", "error": "0" }
# { "gateId": 1, "metric": "new_vulnerabilities", "op": "GT", "error": "0" }
# { "gateId": 1, "metric": "new_security_hotspots_reviewed", "op": "LT", "error": "100" }
# { "gateId": 1, "metric": "new_security_rating", "op": "GT", "error": "1" }

@dataclass
class QualityCondition:
    metric: str
    operator: str
    threshold: str
    rationale: str

conditions = [
    QualityCondition("New Code Coverage",
        "≥ 90%",
        "90% (เข้มกว่า Default 80%)",
        "IAM Code ต้องทดสอบครอบคลุม Auth Flow ทุก Path"),
    QualityCondition("New Code Duplications",
        "≤ 1%",
        "1% (เข้มกว่า Default 3%)",
        "IAM Code ต้อง DRY ลด Bug จาก Copy-paste"),
    QualityCondition("New Bugs",
        "= 0",
        "0 (ทุก Severity)",
        "IAM ไม่ยอมให้มี Bug แม้ Minor"),
    QualityCondition("New Vulnerabilities",
        "= 0",
        "0 (ทุก Severity)",
        "IAM ต้อง 0 Vulnerability เสมอ"),
    QualityCondition("Security Hotspots Reviewed",
        "= 100%",
        "100% (ทุก Hotspot ต้อง Review)",
        "Security Hotspot ใน IAM ต้อง Review ทุกตัว"),
    QualityCondition("Security Rating",
        "= A",
        "A (ไม่มี Vulnerability)",
        "IAM ต้องได้ Security Rating A เสมอ"),
]

print("=== IAM Quality Gate ===")
for c in conditions:
    print(f"  [{c.metric}] {c.operator}")
    print(f"    Threshold: {c.threshold}")
    print(f"    Rationale: {c.rationale}")

CI/CD Pipeline

# === IAM Security Pipeline ===

# GitHub Actions Example
# name: IAM Security Pipeline
# on: [push, pull_request]
# jobs:
#   security-scan:
#     runs-on: ubuntu-latest
#     steps:
#     - uses: actions/checkout@v4
#     - name: Unit Tests + Coverage
#       run: mvn test jacoco:report
#     - name: SonarQube Scan
#       uses: SonarSource/sonarqube-scan-action@v2
#       env:
#         SONAR_TOKEN: }
#         SONAR_HOST_URL: }
#     - name: Quality Gate Check
#       uses: SonarSource/sonarqube-quality-gate-action@v1
#       env:
#         SONAR_TOKEN: }
#     - name: Dependency Check (Snyk)
#       uses: snyk/actions/maven@master
#       env:
#         SNYK_TOKEN: }
#     - name: SAST (Semgrep)
#       uses: returntocorp/semgrep-action@v1
#       with:
#         config: p/owasp-top-ten

@dataclass
class PipelineStage:
    stage: str
    tool: str
    check: str
    fail_action: str

stages = [
    PipelineStage("Unit Test + Coverage",
        "JUnit + JaCoCo / Jest + Istanbul",
        "Coverage ≥ 90% All tests pass",
        "Block PR + Notify Developer"),
    PipelineStage("SonarQube SAST",
        "SonarQube Scanner",
        "Quality Gate Pass (0 Bug 0 Vuln)",
        "Block PR + PR Comment with Issues"),
    PipelineStage("Dependency Check",
        "Snyk / Dependabot / OWASP DC",
        "No Critical/High CVE in Dependencies",
        "Block PR + Create Security Ticket"),
    PipelineStage("Custom SAST",
        "Semgrep / CodeQL",
        "IAM-specific Rules Pass",
        "Block PR + Notify Security Team"),
    PipelineStage("DAST (Staging)",
        "Burp Suite / OWASP ZAP",
        "No Critical/High Findings",
        "Block Release + Security Review"),
    PipelineStage("Security Review",
        "Manual Code Review",
        "Security Team Approval",
        "Block Release until Approved"),
]

print("=== IAM Security Pipeline ===")
for s in stages:
    print(f"  [{s.stage}] Tool: {s.tool}")
    print(f"    Check: {s.check}")
    print(f"    Fail: {s.fail_action}")

เคล็ดลับ

SonarQube คืออะไร

Open Source Code Quality Security SAST Bug Vulnerability Code Smell Coverage Quality Gate 30+ Languages Community Developer Enterprise

IAM Security Scan ทำอย่างไร

Hardcoded Credentials Weak Hashing Insecure Cookie SQL Injection JWT CSRF IDOR Missing Auth RBAC Custom Rules MFA Rate Limit

Quality Gate ตั้งอย่างไร

IAM Strict Coverage 90% Duplications 1% Bugs 0 Vulnerabilities 0 Hotspots 100% Security Rating A Branch Strategy Custom Metrics

CI/CD Integration ทำอย่างไร

GitHub Actions GitLab CI Jenkins SonarQube Scanner Snyk Semgrep CodeQL Burp ZAP Quality Gate Block PR Pipeline Security Review

สรุป

SonarQube Analysis IAM Security SAST Quality Gate Coverage Vulnerability Bug CI/CD Snyk Semgrep DAST Pipeline Authentication Authorization

📖 บทความที่เกี่ยวข้อง

SonarQube Analysis Disaster Recovery Planอ่านบทความ → SonarQube Analysis Message Queue Designอ่านบทความ → Svelte Stores Identity Access Managementอ่านบทความ → IS-IS Protocol Identity Access Managementอ่านบทความ → Go GORM Identity Access Managementอ่านบทความ →

📚 ดูบทความทั้งหมด →