SiamCafe · Blog
SonarQube Analysis Identity Access Management —
บทความ

SonarQube Analysis Identity Access Management —

เผยแพร่ 28 พฤษภาคม 2569

SonarQube IAM Analysis

SonarQube Analysis Identity Access Management —

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

SonarQube Analysis Identity Access Management —
# === 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}")

เคล็ดลับ

  • Quality Gate: ตั้ง IAM Strict Gate เข้มกว่า Default 0 Vuln 0 Bug
  • Hotspot: Review Security Hotspot 100% สำหรับ IAM Code
  • Coverage: ตั้ง Coverage ≥ 90% สำหรับ Auth Authorization Code
  • Custom Rules: เขียน Custom Rules ตรวจ MFA Rate Limit Lockout
  • Pipeline: ใส่ SonarQube + Snyk + Semgrep + DAST ครบทุก Stage

SonarQube คืออะไร

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