하드코딩된 계정 정보

Use of Hardcoded Credentials

설명

하드코딩된 자격 증명(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)

설명:

  • 변경 전: 데이터베이스 자격 증명을 소스 코드에 하드코딩하여, 자격 증명이 유출될 위험이 있습니다.
  • 변경 후: 환경 변수를 사용하여 자격 증명을 설정하고, 소스 코드에 하드코딩하지 않습니다.

참조