SQL Server 를 운영할 때 확인할 보안 항목을 Windows 서버, SQL Server 기본 설정, 개발, 관리, 운영 절차로 나눠 정리했다.
Windows 서버
- 관리 목적 기본 공유(C$, D$, ADMIN$)를 끈다.
HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters에 DWORDAutoShareServer를 0 으로 넣고 Server 서비스를 다시 시작한다. (일반 PC 는AutoShareWks) - 원격 데스크톱 포트를 3389 에서 바꾼다.
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp의PortNumber를 10진수로 바꾸고, 새 포트는 Windows 방화벽과 앞단 방화벽에서 열고 3389 는 막는다. - 기본 계정 Administrator 는 이름을 바꾸고, Guest 는 비활성화한다.
- Windows 방화벽을 켜고 인바운드뿐 아니라 아웃바운드 연결도 필요한 것만 허용한다.
- 보안 취약점 점검 도구로 정기적으로 점검한다. (예전의 MBSA 는 지원이 끝났으니 지금은 Microsoft Defender 취약성 관리나 Security Compliance Toolkit 을 쓴다.)
SQL Server 기본 설정
- sysadmin(시스템 관리자) 권한은 DBA 에게만 준다.
- DBA 개인 계정을 서비스(애플리케이션) 접속용으로 같이 쓰지 않는다.
- DB 계정마다 사용할 DB 를 정해 두고 필요한 권한만 준다.
- 안 쓰는 계정은 정기적으로 찾아서 막는다. 가장 중요한 항목이다.
- 가능하면 Windows 인증을 쓴다.
- SQL Server 에 접속할 수 있는 IP 를 제한한다.
- 기본 포트 1433 을 다른 포트로 바꾸고, 1433 은 방화벽에서 막는다. 포트 변경은 자동 스캔을 줄이는 정도이므로 접속 IP 제한과 함께 쓴다.
- 도메인 컨트롤러나 IIS 웹 서버 같은 응용 프로그램 서버와 분리한다.
- 디스크는 NTFS 로 포맷해서 폴더 권한을 걸 수 있게 한다.
- NetBIOS over TCP/IP 와 SMB 를 쓰지 않는다. (135, 137~139, 445 포트)
- SQL Server 서비스는 기본 시작 계정 대신 전용 계정을 만들어서 돌린다.
- sa 계정은 쓰지 않고 이름을 바꿔 둔다.
- BUILTIN\Administrators 그룹 로그인이 있으면 지운다. (SQL Server 2008 부터는 기본으로 추가되지 않는다.)
- 예제 데이터베이스는 설치하지 않는다.
- 설치 로그와 설치에 쓴 스크립트는 지운다.
- xp_cmdshell 처럼 보안에 취약한 확장 저장 프로시저는 끈다.
- 기본 추적(Default Trace)이 켜져 있는지 확인하고 살펴본다.
개발
- SQL Injection 방어 코드는 클라이언트 스크립트가 아니라 서버 쪽에 둔다.
- DB 오류 메시지를 웹 페이지에 보여 주지 않는다. 오류 내용에 DB 정보가 드러나 Error-based SQL Injection 에 쓰인다.
- 동적 쿼리는 될 수 있는 한 줄인다.
- 암호를 암호화하지 않은 채 DB 나 로컬 디스크에 저장하지 않는다.
- 테이블에 직접 권한을 주지 말고 저장 프로시저와 뷰를 통해서만 접근하게 한다. 컬럼 단위 권한보다 관리가 쉽다.
- guest 계정은 쓰지 않는다.
- 사용자 계정에 개체를 만드는 권한(CREATE)을 주지 않는다.
- 권한을 넘겨줘야 할 때는 프록시 계정을 쓴다.
- sa 로 접속하지 않는다. 웹과 연결된 경우 특히 치명적이다.
관리
- 서버 화면 보호기에 암호를 건다.
- 백업은 암호를 거는 등 안전한 방식으로 하고, 다른 곳에 2차 백업을 둔다.
- 사용자 계정은 최소 권한만 주고 암호를 주기적으로 바꾼다.
- 실패한 로그인과 거부된 로그인을 감사(기록)한다.
- 권한을 불법적으로 얻는 시도가 있는지 감사한다.
- 강력한 암호 정책을 쓴다. (9자 이상, 영문·숫자·특수문자 섞기, 30일마다 변경)
- 보안 감사를 정기적으로 한다.
- 보안 패치를 적용한다.
- 프로시저에 EXECUTE AS CALLER 가 아닌 실행 권한이 설정된 것이 있는지 확인한다.
- 서버 시작 때 자동 실행되는 프로시저가 있는지 확인한다.
운영 절차
- 침해 사고가 났을 때 대응 절차를 문서로 만들어 둔다.
- 서버별로 열려 있는 포트와 방화벽에서 허용한 포트를 문서로 관리한다.
- 네트워크 모니터링과 로그 분석으로 과도한 접속 시도를 찾고, 어떤 IP 에서 왔는지 꼭 확인한다.
- 직원이 퇴사하면 퇴사일에 계정 정지와 공용 암호 변경 등 보안 작업을 끝낸다.
- 내부 보안을 강화한다. 가장 중요하지만 가장 지켜지지 않는 부분이다.
참고한 자료: ToTo – MSSQL 보안 체크리스트, sink81 – MSSQL 보안 체크리스트, 29cm – OS 및 MS-SQL 보안에 관한 기본적인 설정
관련 글: SQL Injection 방어

Leave a Reply