환경 변수
앞서 언급한 내용중 사용자당 최대 스택이나 요청 속도 제한 등과 같은 세부적인 값들과 CORS를 백엔드 애플리케이션의 환경 변수를 통해 설정할 수 있습니다.
CORS는 프로덕션 모드에서만 활성화되며, 마찬가지로 환경 변수를 통해 오리진을 설정할 수 있습니다.
애플리케이션이 업데이트되면서 환경 변수 또한 변경될 수 있습니다. 예시의 환경 변수는 .env.example 파일을 참고하세요.
Application
Section titled “Application”# AppAPP_ENV=localHTTP_ADDR=:8080SHUTDOWN_TIMEOUT=10sAUTO_MIGRATE=trueBCRYPT_COST=12애플리케이션의 전반적인 설정을 구성하는 환경변수로, 실행 환경이나 HTTP 서버 주소와 포트, Graceful shutdown 타임아웃, 자동 마이그레이션 여부, 그리고 bcrypt 해싱의 비용 인자 등을 설정할 수 있습니다. 기본 포트는 8080입니다.
이때 자동 마이그레이션은 애플리케이션이 시작될 때 DB 마이그레이션을 자동으로 수행하는 기능으로, 기존에 데이터가 있는 경우 무시되므로 프로덕션 환경에서도 사용할 수 있습니다. 다만 마이그레이션이 필요한 변경사항이 있는 경우 수동으로 마이그레이션을 수행하세요.
BCRYPT_COST는 bcrypt 해싱의 비용 인자로, 값이 높을수록 보안성이 높아지지만 해싱에 더 많은 시간이 소요됩니다. 일반적으로 12 이상의 값을 권장하지만, 시스템의 성능과 요구사항에 따라 적절히 조정하세요.
# PostgreSQLDB_HOST=localhostDB_PORT=5432DB_USER=app_userDB_PASSWORD=app_passwordDB_NAME=app_dbDB_SSLMODE=disableDB_MAX_OPEN_CONNS=25DB_MAX_IDLE_CONNS=10DB_CONN_MAX_LIFETIME=30mPostgreSQL 데이터베이스 연결을 전반적인 설정입니다. 실제 프로덕션 환경에선 AWS RDS 엔드포인트를 추가합니다. 필요에 따라 적절히 조정하세요.
# RedisREDIS_ADDR=localhost:6379REDIS_PASSWORD=REDIS_DB=0REDIS_POOL_SIZE=20Redis 연결에 대한 설정입니다. 실제 프로덕션 환경에선 AWS ElastiCache 엔드포인트를 추가합니다. 필요에 따라 적절히 조정하세요.
# JWTJWT_SECRET=change-meJWT_ISSUER=smctfJWT_ACCESS_TTL=24hJWT_REFRESH_TTL=168hJWT 토큰의 시크릿 키와 발급자, 그리고 액세스 토큰과 리프레시 토큰의 TTL을 설정합니다.
JWT_SECRET은 반드시 변경되어야 하며, 충분히 길고 예측 불가능한 고유의 값으로 설정해야 합니다. 프로덕션 환경에선 반드시 안전하게 관리되어야 하며 절대 노출되지 않도록 주의하세요.
Security & Flag submit rate limit
Section titled “Security & Flag submit rate limit”# SecurityFLAG_HMAC_SECRET=change-me-tooSUBMIT_WINDOW=1mSUBMIT_MAX=10
FLAG_HMAC_SECRET는 플래그 제출의 무결성을 검증하기 위한 HMAC 시크릿 키로, 반드시 변경되어야 하며 충분히 길고 예측 불가능한 고유의 값으로 설정해야 합니다. 프로덕션 환경에선 반드시 안전하게 관리되어야 하며 절대 노출되지 않도록 주의하세요.
아래의 두 옵션은 플래그 제출에 대한 요청 속도 제한을 설정하는 옵션입니다. SUBMIT_WINDOW 내에 SUBMIT_MAX 이상의 플래그 제출을 허용하지 않도록 설정합니다. 이는 Brute Force 공격을 방지하기 위한 기본적인 보안 조치입니다. 필요에 따라 적절히 조정하세요.
# CacheTIMELINE_CACHE_TTL=60sLEADERBOARD_CACHE_TTL=60sAPP_CONFIG_CACHE_TTL=2m캐시 TTL(Time To Live) 설정으로, 자세한 내용은 Redis 캐싱 문서를 참고하세요. DB 쿼리를 최소화하기 위한 캐시 설정입니다.
# CORSCORS_ALLOWED_ORIGINS=http://localhost:3000,https://smctf.example.comCORS는 프로덕션 모드에서 활성화되며, 위 환경 변수를 통해 허용된 오리진을 설정할 수 있습니다. 여러 오리진을 허용하려면 쉼표로 구분하여 나열하세요.
Stack (Container Provisioner)
Section titled “Stack (Container Provisioner)”# Stack (Container Provisioner)STACKS_ENABLED=trueSTACKS_MAX_PER_USER=3STACKS_PROVISIONER_BASE_URL=http://localhost:8081STACKS_PROVISIONER_API_KEY=change-meSTACKS_PROVISIONER_TIMEOUT=5sSTACKS_CREATE_WINDOW=1mSTACKS_CREATE_MAX=1Container Provisioner에 대한 클라이언트 설정과 스택 생성에 대한 제한 설정입니다.
STACKS_MAX_PER_USER는 한명의 유저가 동시에 생성할 수 있는 스택의 최대 개수를 설정하는 옵션입니다. 리소스 관리에 있어 중요한 설정이므로 적절히 조정하세요. 2~3개를 권장하지만 상황에 따라 1개로 제한할 수도 있습니다.
STACK_PROVISIONER_API_KEY는 내부 마이크로서비스 간 통신 시 공통된 API Key를 요구하는 방식으로 인증을 구현하기 위한 시크릿 키입니다.
마이크로서비스간 통신에서 트래픽이 노출될 일은 없지만, 만일의 상황을 대비하여 충분히 길고 예측 불가능한 고유의 값으로 설정하는 것을 권장합니다.
STACKS_CREATE_WINDOW와 STACKS_CREATE_MAX는 스택 생성에 대한 요청 속도 제한을 설정하는 옵션입니다.
STACKS_CREATE_WINDOW 내에 STACKS_CREATE_MAX 이상의 스택 생성 요청을 허용하지 않도록 설정합니다. 필요에 따라 적절히 조정하세요.
Logging
Section titled “Logging”# LoggingLOG_DIR=logsLOG_FILE_PREFIX=appLOG_MAX_BODY_BYTES=1048576기본적으로 SMCTF 백엔드는 JSON으로 구조화된 로그를 stdout/stderr로 출력하며, 시간대별로 로그 파일을 분리하여 저장하는 Rotating 로깅이 구현되어 있습니다.
자세한 내용은 인프라 문서의 로깅 및 모니터링 문서를 참고하세요.
Bootstrap
Section titled “Bootstrap”# BootstrapBOOTSTRAP_ADMIN_TEAM=trueBOOTSTRAP_ADMIN_USER=trueBOOTSTRAP_ADMIN_USERNAME=adminBOOTSTRAP_ADMIN_EMAIL=BOOTSTRAP_ADMIN_PASSWORD=초기 관리자 팀/유저를 생성하기 위한 부트스트랩 설정으로, 활성화 시 자동 DB 마이그레이션과 함께 Admin 팀과 초기 관리자 계정이 생성됩니다. 이때 초기 관리자 계정은 DB에 아무 데이터가 없는 상태에서만 생성됩니다.
자세한 내용은 부트스트랩 문서를 참조하세요.
S3 (Challenge Files)
Section titled “S3 (Challenge Files)”# S3 Challenge FilesS3_ENABLED=trueS3_REGION=ap-northeast-2S3_BUCKET=S3_ACCESS_KEY_ID=S3_SECRET_ACCESS_KEY=S3_ENDPOINT=S3_FORCE_PATH_STYLE=falseS3_PRESIGN_TTL=15mAWS S3 클라이언트를 사용하기 위한 옵션입니다. 자신의 고유한 S3 버킷을 지정하세요.
프로덕션에서 IRSA로 AWS 리소스에 접근하는 경우 S3_ACCESS_KEY_ID와 S3_SECRET_ACCESS_KEY는 필요하지 않습니다. 나머지 설정은 필요에 따라 적절하게 조정하세요.