데이터베이스 비밀번호 미설정 (Empty Database Password)

비밀번호 인증을 사용하는 데이터베이스 연결에 빈 비밀번호를 지정한 경우

설명

비밀번호 인증이 필요한 데이터베이스 계정에 빈 비밀번호로 연결하면 접속이 거부되거나, 서버가 빈 비밀번호를 허용하는 경우 신원 확인이 약해질 수 있습니다. 빈 문자열을 전달했다고 누구나 접속할 수 있는 것은 아닙니다. 실제 접근은 서버의 인증 방식, 허용된 클라이언트와 계정 권한에 따라 달라지며, 인증서나 외부 ID를 사용하는 정상적인 비밀번호 없는 인증과 구분해야 합니다.

잠재적 영향

  • 데이터 유출·변경: 서버가 빈 비밀번호로 접속을 허용하면 해당 계정 권한 범위에서 데이터를 조회·수정·삭제할 수 있습니다.
  • 관리 기능 악용: 계정에 관리 권한이 있다면 설정 변경 등으로 피해가 확대될 수 있습니다.

해결 방법

  1. 비밀번호 인증 계정에는 강력한 비밀번호를 설정하고 서버에서 빈 비밀번호 접속을 차단하세요. 다른 인증 방식을 의도했다면 서버와 드라이버 설정을 확인하세요.
  2. 비밀번호를 코드에 넣지 말고 HashiCorp Vault 같은 비밀정보 저장소나 접근이 제한된 실행 환경에서 제공하세요. KMS는 암호화 키 관리 서비스이므로 비밀정보 저장·조회 구성과 구분하세요.
  3. 계정 권한과 네트워크 접근을 최소화하고, 원격 연결에는 서버 인증서를 검증하는 TLS를 구성하세요.

예시

변경 전

java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class InsecureDBConnection {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = "root";
        String password = ""; // 비밀번호 없음 (위험)

        Connection conn = DriverManager.getConnection(url, user, password);
    }
}

변경 후

java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SecureDBConnection {
    public static void main(String[] args) throws SQLException {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = System.getenv("DB_USER"); // 환경 변수에서 로드
        String password = System.getenv("DB_PASSWORD");

        if (password == null || password.isEmpty()) {
            throw new SecurityException("Database password is not set");
        }

        Connection conn = DriverManager.getConnection(url, user, password);
    }
}

설명:

  • 변경 전: root 계정에 빈 비밀번호를 전달합니다. 접속 허용 여부는 데이터베이스 서버 설정에 따릅니다.
  • 변경 후: 환경 변수에서 계정과 비밀번호를 읽고 비밀번호가 없거나 비어 있으면 중단합니다. 환경 변수만으로 비밀정보가 보호되지는 않으므로 실행 환경과 로그 접근을 제한하세요. 연결 해제와 실제 드라이버의 TLS 설정은 생략한 예시입니다.

참조