보관함

MSSQL 보안 체크리스트

SQL Server 를 운영할 때 확인할 보안 항목을 Windows 서버, SQL Server 기본 설정, 개발, 관리, 운영 절차로 나눠 정리했다.

Windows 서버

  1. 관리 목적 기본 공유(C$, D$, ADMIN$)를 끈다. HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 에 DWORD AutoShareServer 를 0 으로 넣고 Server 서비스를 다시 시작한다. (일반 PC 는 AutoShareWks)
  2. 원격 데스크톱 포트를 3389 에서 바꾼다. HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp 의 PortNumber 를 10진수로 바꾸고, 새 포트는 Windows 방화벽과 앞단 방화벽에서 열고 3389 는 막는다.
  3. 기본 계정 Administrator 는 이름을 바꾸고, Guest 는 비활성화한다.
  4. Windows 방화벽을 켜고 인바운드뿐 아니라 아웃바운드 연결도 필요한 것만 허용한다.
  5. 보안 취약점 점검 도구로 정기적으로 점검한다. (예전의 MBSA 는 지원이 끝났으니 지금은 Microsoft Defender 취약성 관리나 Security Compliance Toolkit 을 쓴다.)

SQL Server 기본 설정

  1. sysadmin(시스템 관리자) 권한은 DBA 에게만 준다.
  2. DBA 개인 계정을 서비스(애플리케이션) 접속용으로 같이 쓰지 않는다.
  3. DB 계정마다 사용할 DB 를 정해 두고 필요한 권한만 준다.
  4. 안 쓰는 계정은 정기적으로 찾아서 막는다. 가장 중요한 항목이다.
  5. 가능하면 Windows 인증을 쓴다.
  6. SQL Server 에 접속할 수 있는 IP 를 제한한다.
  7. 기본 포트 1433 을 다른 포트로 바꾸고, 1433 은 방화벽에서 막는다. 포트 변경은 자동 스캔을 줄이는 정도이므로 접속 IP 제한과 함께 쓴다.
  8. 도메인 컨트롤러나 IIS 웹 서버 같은 응용 프로그램 서버와 분리한다.
  9. 디스크는 NTFS 로 포맷해서 폴더 권한을 걸 수 있게 한다.
  10. NetBIOS over TCP/IP 와 SMB 를 쓰지 않는다. (135, 137~139, 445 포트)
  11. SQL Server 서비스는 기본 시작 계정 대신 전용 계정을 만들어서 돌린다.
  12. sa 계정은 쓰지 않고 이름을 바꿔 둔다.
  13. BUILTIN\Administrators 그룹 로그인이 있으면 지운다. (SQL Server 2008 부터는 기본으로 추가되지 않는다.)
  14. 예제 데이터베이스는 설치하지 않는다.
  15. 설치 로그와 설치에 쓴 스크립트는 지운다.
  16. xp_cmdshell 처럼 보안에 취약한 확장 저장 프로시저는 끈다.
  17. 기본 추적(Default Trace)이 켜져 있는지 확인하고 살펴본다.

개발

  1. SQL Injection 방어 코드는 클라이언트 스크립트가 아니라 서버 쪽에 둔다.
  2. DB 오류 메시지를 웹 페이지에 보여 주지 않는다. 오류 내용에 DB 정보가 드러나 Error-based SQL Injection 에 쓰인다.
  3. 동적 쿼리는 될 수 있는 한 줄인다.
  4. 암호를 암호화하지 않은 채 DB 나 로컬 디스크에 저장하지 않는다.
  5. 테이블에 직접 권한을 주지 말고 저장 프로시저와 뷰를 통해서만 접근하게 한다. 컬럼 단위 권한보다 관리가 쉽다.
  6. guest 계정은 쓰지 않는다.
  7. 사용자 계정에 개체를 만드는 권한(CREATE)을 주지 않는다.
  8. 권한을 넘겨줘야 할 때는 프록시 계정을 쓴다.
  9. sa 로 접속하지 않는다. 웹과 연결된 경우 특히 치명적이다.

관리

  1. 서버 화면 보호기에 암호를 건다.
  2. 백업은 암호를 거는 등 안전한 방식으로 하고, 다른 곳에 2차 백업을 둔다.
  3. 사용자 계정은 최소 권한만 주고 암호를 주기적으로 바꾼다.
  4. 실패한 로그인과 거부된 로그인을 감사(기록)한다.
  5. 권한을 불법적으로 얻는 시도가 있는지 감사한다.
  6. 강력한 암호 정책을 쓴다. (9자 이상, 영문·숫자·특수문자 섞기, 30일마다 변경)
  7. 보안 감사를 정기적으로 한다.
  8. 보안 패치를 적용한다.
  9. 프로시저에 EXECUTE AS CALLER 가 아닌 실행 권한이 설정된 것이 있는지 확인한다.
  10. 서버 시작 때 자동 실행되는 프로시저가 있는지 확인한다.

운영 절차

  1. 침해 사고가 났을 때 대응 절차를 문서로 만들어 둔다.
  2. 서버별로 열려 있는 포트와 방화벽에서 허용한 포트를 문서로 관리한다.
  3. 네트워크 모니터링과 로그 분석으로 과도한 접속 시도를 찾고, 어떤 IP 에서 왔는지 꼭 확인한다.
  4. 직원이 퇴사하면 퇴사일에 계정 정지와 공용 암호 변경 등 보안 작업을 끝낸다.
  5. 내부 보안을 강화한다. 가장 중요하지만 가장 지켜지지 않는 부분이다.

참고한 자료: ToTo – MSSQL 보안 체크리스트, sink81 – MSSQL 보안 체크리스트, 29cm – OS 및 MS-SQL 보안에 관한 기본적인 설정

관련 글: SQL Injection 방어

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.