NetBackup 클라이언트에 Backup Exec DSN이 자꾸 생기는 이유
NetBackup Client 11.2를 깔아 둔 테스트 서버에서 ODBC 데이터 원본 목록을 보다가 이상한 걸 발견했다. 서버에 Backup Exec은 설치한 적도 없는데 "Backup Exec Catalogs"라는 시스템 DSN이 떡하니 있었다. 레지스트리에서 지워 봤지만 며칠 지나면 또 생겨 있었다. 뭐가 만드는 건지 궁금해서 끝까지 파 봤다.
어떤 항목이 생기나
생기는 건 DSN 하나가 아니라 드라이버 등록까지 4개다.
HKLM\SOFTWARE\ODBC\ODBC.INI\Backup Exec Catalogs(Driver = becatdrv.dll)HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources아래 "Backup Exec Catalogs" 값HKLM\SOFTWARE\ODBC\ODBCINST.INI\Backup Exec Catalog Driver(Driver, Setup = becatdrv.dll)HKLM\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers아래 "Backup Exec Catalog Driver" 값
재밌는 건 드라이버로 지정된 becatdrv.dll이 서버 어디에도 없다는 점이다. 그러니까 이 DSN은 써먹을 수도 없는 껍데기다.
설치 패키지 문제일까
처음엔 MSI가 등록하는 줄 알았다. C:\Windows\Installer에 캐시된 NetBackup Client MSI를 열어서 테이블을 전부 뽑아 봤는데 ODBCDataSource 같은 테이블 자체가 없었다. Registry 테이블에 DSN이 하나 있긴 한데 NBAZDB(PostgreSQL)이고, 그마저도 마스터/미디어 서버 설치일 때만 들어가는 항목이었다.
대신 눈에 띈 게 있었다. 클라이언트 기능에 bedsnt5.dll 같은 Backup Exec 엔진 DLL이 잔뜩 들어 있었다. 버전도 52.0.1011.0, 딱 Backup Exec식 번호다. NetBackup 윈도우 클라이언트가 내부적으로 Backup Exec 엔진(BEDS)을 쓴다는 얘기다.
범인은 bedssql2.dll
NetBackup bin 폴더 바이너리를 다 뒤져서 "Backup Exec Catalogs" 문자열을 찾았더니 bedssql2.dll 하나만 걸렸다. Backup Exec SQL 에이전트 엔진이고, 디버그 경로에 E:\BEDS_11.2\1011R\...가 박혀 있다.
capstone으로 디스어셈블해 보니 구조가 단순했다.
- 0xFF10: C++ 전역 객체 초기화 코드. DLL이 로드되면 알아서 돈다. 생성자를 부르고 소멸자를 atexit에 걸어 둔다.
- 0xD0980 (생성자): ODBCINST.INI에 드라이버를, ODBC.INI에 DSN을 레지스트리 API로 직접 써 넣는다. 이미 드라이버가 Installed로 잡혀 있으면 건너뛰고 내부 플래그를 1로 세운다.
- 0xFEFC0 (소멸자): DLL이 내려갈 때 위 항목을 지운다. 그런데 플래그가 1이면 안 지운다.
즉 DLL을 올리면 DSN이 생기고, 정상적으로 내리면 사라지는 구조다.
직접 재현
ODBC.INI, ODBCINST.INI 키에 레지스트리 감사(SACL)를 걸어 두고 하나씩 돌려 봤다.
| 시험 | 실행 중 | 종료 후 |
|---|---|---|
| bedssql2.dll 로드 → FreeLibrary | 생김 | 지워짐 |
| bedssql2.dll 로드 → 프로세스 강제 종료 | 생김 | 남음 |
| bpbkar32.exe 실행 | 생김 | 지워짐 |
| NetBackup 서비스 재시작 | 변화 없음 | 변화 없음 |
보안 로그(4657, 4663)를 보면 bpbkar32.exe가 4개 항목을 만들고 0.26초쯤 뒤에 지운 기록이 그대로 찍혀 있다. bpresolver, bpfis, tar32, W2KUtil, bpmount는 실행해도 아무것도 안 만들었다.
왜 계속 남아 있나
정리하면 백업이든 탐색이든 bpbkar32.exe가 뜰 때마다 DSN이 잠깐 생겼다가 사라진다. 평소엔 눈에 안 띄는 게 정상이다.
문제는 bpbkar32.exe가 깔끔하게 안 끝날 때다. 작업 취소나 타임아웃으로 프로세스가 죽으면 소멸자가 안 돌아서 항목이 남는다. 한 번 남으면 그다음부터는 더 꼬인다. 다음 bpbkar32.exe는 "이미 누가 등록해 놨네" 하고 플래그를 세우고, 종료할 때 안 지운다. 그래서 한 번 남은 DSN은 사실상 영구히 남는다.
강제 종료 케이스는 테스트 프로세스로 DLL을 올린 뒤 죽여서 재현한 거다. 실제 백업 중에 bpbkar32.exe가 죽어서 남는 장면까지 잡지는 못했는데, 코드 경로가 같으니 결과도 같을 거라고 본다.
그래서 어떻게 하나
becatdrv.dll이 없으니 이 DSN은 동작하지 않고, NetBackup이나 다른 프로그램에 영향 준 것도 못 봤다. 점검 도구에서 정체 모를 DSN으로 잡히는 정도다.
남은 항목은 그냥 지워도 된다. 백업 돌 때 잠깐 다시 생기고 정상 종료하면 알아서 사라진다. 너무 거슬리면 백업 시간 피해서 지우는 예약 작업 하나 걸어 두면 된다. 레지스트리 권한을 막아 버리는 방법도 떠오르긴 하는데, bpbkar32.exe가 그걸 어떻게 받아들일지 확인을 안 해 봐서 권하진 않는다. 근본적으로는 Cohesity 쪽에서 고쳐 줘야 할 부분이라 지원 케이스로 넘겨 둘 생각이다.