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 쪽에서 고쳐 줘야 할 부분이라 지원 케이스로 넘겨 둘 생각이다.