배치 스크립트나 리포팅 도구의 접속 구문에 비밀번호가 평문으로 박혀 있으면 소스 저장소·로그·화면 캡처 어디로든 새어 나간다. 해결 방향은 둘이다. 비밀번호를 다른 곳에 두는 것과, 클라이언트 쪽에서 비밀번호를 아예 다루지 않게 하는 것이다.
Oracle Net 의 외부 비밀번호 저장소(Secure External Password Store)를 쓰면 접속 구문에서 사용자와 비밀번호를 모두 뺄 수 있다. 인증에 필요한 자격증명은 지갑 파일이 갖고 있고, 클라이언트는 TNS 별칭만 넘긴다.
# 자동 로그인 지갑 생성
mkstore -wrl /opt/oracle/wallet -create
# 별칭에 자격증명 등록
mkstore -wrl /opt/oracle/wallet -createCredential ORADB app_owner
# 등록 확인
mkstore -wrl /opt/oracle/wallet -listCredential
sqlnet.ora 에서 지갑 위치를 알려 주고 덮어쓰기를 켠다.
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA = (DIRECTORY = /opt/oracle/wallet))
)
SQLNET.WALLET_OVERRIDE = TRUE
이후 접속은 자격증명 없이 별칭만 준다.
sqlplus /@ORADB
주의할 점이 셋이다. 지갑 파일 자체가 자격증명이다. cwallet.sso 를 읽을 수 있는 OS 계정이면 누구나 접속할 수 있으므로 파일 권한을 600 으로 두고 실행 계정만 접근하게 한다. tnsnames.ora 의 별칭과 createCredential 의 별칭이 정확히 같아야 한다. 그리고 Thin 모드 드라이버는 이 방식을 그대로 쓰지 못하는 경우가 있으므로 도구별로 확인한다.
지갑을 쓸 수 없는 도구는 접속 정보를 별도 파일에 두고 코드에서는 참조만 한다. SAS 의 authinfo, curl 의 .netrc 가 같은 형태다.
machine ORADB login app_owner password ${PASSWORD}
chmod 600 ~/.authinfo
파일을 홈 디렉터리에 두면 백업이나 홈 공유로 함께 퍼질 수 있다. 서비스 전용 디렉터리에 두고 경로를 명시하는 편이 낫다.
컨테이너 환경에서는 오케스트레이터의 시크릿을 환경 변수로 주입하는 방식이 가장 흔하다.
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: oracle-app
key: password
간단하지만 새는 경로가 여럿이다. ps e, /proc/<pid>/environ, 코어 덤프, 예외 스택 출력에 그대로 드러난다. 값을 로그로 찍지 않도록 애플리케이션에서 마스킹하고, 시크릿을 파일로 마운트해 읽는 방식과 비교해 고른다.
| 상황 | 권장 |
|---|---|
| 단일 서버에서 도는 배치 | Wallet |
| 인증 파일 방식만 지원하는 상용 도구 | 인증 파일 + 권한 600 |
| 컨테이너·Kubernetes | 시크릿을 파일로 마운트하고 Wallet 또는 인증 파일 형태로 읽게 한다 |
| 어떤 방법도 안 될 때 | 최소 권한 계정 + 접속 로그 감사. 평문 보관은 마지막 수단이다 |