설명
하드코딩된 자격 증명(Use of Hardcoded Credentials)은 애플리케이션에 자격 증명(예: 사용자 이름, 비밀번호, API 키 등)을 소스 코드에 직접 포함하는 취약성입니다. 이는 소스 코드가 유출될 경우 심각한 보안 위험을 초래할 수 있습니다.
잠재적 영향
- 자격 증명 노출: 하드코딩된 자격 증명이 유출되어 공격자가 시스템에 무단으로 접근할 수 있습니다.
- 권한 상승: 노출된 자격 증명에 관리자 권한이 있다면 공격자가 시스템을 조작할 수 있습니다.
- 데이터 유출: 민감한 데이터가 공격자에게 노출될 수 있습니다.
해결 방법
- 환경 변수 사용: 자격 증명을 소스 코드에 하드코딩하지 않고 환경 변수로 설정합니다.
- 보안 저장소 사용: 자격 증명을 안전하게 저장하고 관리할 수 있는 보안 저장소를 사용합니다.
- 자격 증명 관리: 주기적으로 자격 증명을 변경하고, 사용되지 않는 자격 증명은 폐기합니다.
노출된 자격 증명은 폐기하고 새 값으로 교체하세요. 아래 DATABASE_URL에는 배포 환경에서 관리하는 완전한 연결 문자열을 설정합니다.
예시
Django
변경 전
python
# Unsafe Django code
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
변경 후
python
# Safe Django code
import os
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'PORT': os.getenv('DB_PORT'),
}
}
설명:
- 변경 전: 데이터베이스 자격 증명을 소스 코드에 하드코딩하여, 자격 증명이 유출될 위험이 있습니다.
- 변경 후: 환경 변수를 사용하여 자격 증명을 설정하고, 소스 코드에 하드코딩하지 않습니다.
Flask
변경 전
python
# Unsafe Flask code
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://myuser:mypassword@localhost/mydatabase'
변경 후
python
# Safe Flask code
import os
app.config['SQLALCHEMY_DATABASE_URI'] = os.environ['DATABASE_URL']
설명:
- 변경 전: 데이터베이스 자격 증명을 소스 코드에 하드코딩하여, 자격 증명이 유출될 위험이 있습니다.
- 변경 후: 환경 변수를 사용하여 자격 증명을 설정하고, 소스 코드에 하드코딩하지 않습니다.
FastAPI
변경 전
python
# Unsafe FastAPI code
DATABASE_URL = "postgresql://myuser:mypassword@localhost/mydatabase"
@app.on_event("startup")
async def startup():
app.state.pool = await asyncpg.create_pool(DATABASE_URL)
변경 후
python
# Safe FastAPI code
import os
DATABASE_URL = os.environ['DATABASE_URL']
@app.on_event("startup")
async def startup():
app.state.pool = await asyncpg.create_pool(DATABASE_URL)
설명:
- 변경 전: 데이터베이스 자격 증명을 소스 코드에 하드코딩하여, 자격 증명이 유출될 위험이 있습니다.
- 변경 후: 환경 변수를 사용하여 자격 증명을 설정하고, 소스 코드에 하드코딩하지 않습니다.