보관함

리눅스 서버 성능 모니터링 명령어 정리 (top, vmstat, ps, iostat, sar, tcpdump 등)

서버가 느려졌을 때 디스크, CPU·메모리, 네트워크 중 어디가 병목인지 찾는 데 쓰는 명령어와 도구를 정리했다.

1. top – 실시간 프로세스 현황

CPU, 메모리를 많이 쓰는 프로세스를 실시간으로 보여 준다. 기본 3초마다 갱신된다.

키 기능
P / M CPU 사용량 순 / 메모리 사용량 순으로 정렬
t CPU 요약 줄 표시 방식 바꾸기
m 메모리 요약 줄 표시 방식 바꾸기
1 CPU 코어별로 나눠 보기
f 표시할 항목과 정렬 기준 고르기
r renice (우선순위 변경)
k kill (프로세스 종료)
z 컬러 / 흑백 전환

2. vmstat – 프로세스, 메모리, 스왑, I/O, CPU

r(실행 대기 프로세스)가 CPU 코어 수보다 계속 많으면 CPU 병목, si/so(스왑 입출력)가 0 이 아니면 메모리 부족, wa(I/O 대기)가 높으면 디스크 병목을 의심한다.

3. w – 로그인한 사용자와 하는 일

4. uptime – 가동 시간과 평균 부하

load average 는 1분, 5분, 15분 평균이다. CPU 코어 수보다 작으면 여유가 있고, 코어 수를 계속 넘으면 대기하는 작업이 쌓이고 있다는 뜻이다. 코어 수는 nproc 으로 확인한다.

5. ps – 프로세스 목록

출력 항목은 -o 로 고른다. (예: ps -eo pid,user,pcpu,pmem,stat,comm)

6. free – 메모리 사용량

리눅스는 남는 메모리를 캐시로 쓰기 때문에 free 값이 작아도 문제가 아니다. 실제로 쓸 수 있는 양은 available 열을 본다.

7. iostat – CPU 와 디스크 I/O

%util 이 100% 에 가깝거나 await(평균 대기 시간)이 크면 디스크가 병목이다. (sysstat 패키지)

8. sar – 시스템 활동 기록과 조회

sysstat 수집을 켜 두면 지난 기록도 조회할 수 있어서, 문제가 났던 시간대의 상태를 나중에 확인할 때 쓴다.

9. mpstat – CPU 별 사용량

특정 코어 하나만 100% 이면 단일 스레드 프로그램이 병목인 경우가 많다.

10. pmap – 프로세스 메모리 지도

마지막 줄의 mapped(매핑된 전체), writeable/private(그 프로세스만 쓰는 양), shared(다른 프로세스와 공유하는 양)를 보고 메모리를 실제로 얼마나 쓰는지 판단한다.

11. ss, netstat – 네트워크 연결

12. iptraf-ng – 실시간 네트워크 통계

ncurses 화면으로 TCP 연결별, 인터페이스별, 프로토콜별, 포트·패킷 크기별 트래픽을 보여 준다. 지금 배포판의 패키지 이름은 iptraf-ng 다.

13. tcpdump – 패킷 캡처

14. strace – 시스템 호출 추적

프로세스가 멈춰 있을 때 무엇을 기다리는지(파일, 네트워크, 잠금) 확인할 때 쓴다.

15. /proc – 커널이 보여 주는 정보

16. lsof – 열려 있는 파일

프로세스가 열고 있는 파일, 소켓, 파이프, 장치를 보여 준다. 디스크를 언마운트할 때 “사용 중” 오류가 나면 어떤 프로세스가 잡고 있는지 찾는 데 쓴다.

17. htop – top 의 개선판

top 과 같은 정보를 색과 막대그래프로 보여 주고, 화살표로 프로세스를 골라 종료·우선순위 변경을 할 수 있다. 트리 보기(F5)와 검색(F3)도 된다. (apt install htop)

18. iotop – 프로세스별 디스크 I/O

어떤 프로세스가 디스크를 읽고 쓰는지 실시간으로 보여 준다. iostat 으로 디스크 병목을 확인한 뒤 원인 프로세스를 찾을 때 쓴다.

19. nethogs, iftop, vnstat – 네트워크 대역폭

vnstat 기록은 vnStat PHP 같은 웹 화면으로 그래프를 볼 수도 있다.

20. psacct(acct) – 사용자 활동 기록

사용자별로 어떤 명령을 실행했고 자원을 얼마나 썼는지 백그라운드에서 기록한다. (Debian/Ubuntu 패키지는 acct, RHEL 계열은 psacct)

21. arpwatch, Suricata – 네트워크 보안 감시

arpwatch 는 네트워크의 IP·MAC 주소 짝이 바뀌는 것을 기록하고 메일로 알려 줘서 ARP 스푸핑을 찾는 데 쓴다. Suricata 는 OISF 가 만든 오픈소스 침입 탐지·방지 시스템(IDS/IPS)이다.

22. 모니터링 시스템

  • Nagios: 서버, 네트워크 장비, 서비스를 감시하다가 이상이 생기거나 복구되면 알림을 보낸다.
  • Cacti: RRDTool 로 네트워크, CPU, 메모리, 웹 서버 등의 수치를 모아 그래프로 보여 준다.
  • Monit: Apache, MySQL, Nginx, SSH 같은 서비스와 파일, 파일시스템을 감시하다가 문제가 생기면 자동으로 재시작하거나 알린다. 웹 화면도 있다.
  • Monitorix: 내장 웹 서버로 부하, 메모리, 디스크 상태, 서비스, 메일, MySQL 통계 등을 그래프로 보여 주는 가벼운 도구다.
  • 요즘은 Prometheus + Grafana, Zabbix 같은 도구도 많이 쓴다.

참고한 자료: nixCraft – Linux Performance Monitoring Tools, iprize 번역, Tecmint – Command Line Tools to Monitor Linux Performance

관련 글: server monitoring tools, Load Avg, nmon 옵션

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 방어

MariaDB 운영 메모 – 계정과 권한, 백업과 복원, 복제(Replication)

아래 예시의 appdb, app, <password>, 10.0.0.x 는 실제 값으로 바꿔서 쓴다.

1. 설치

2. DB, 계정, 권한

root@'%' 처럼 root 를 외부에 여는 것은 피하고, 서비스마다 필요한 DB 에만 권한을 준 계정을 따로 만든다. GRANT 와 CREATE USER 를 쓰면 FLUSH PRIVILEGES 는 필요 없다.

3. 백업과 복원

-p비밀번호 처럼 명령줄에 비밀번호를 쓰면 프로세스 목록과 쉘 히스토리에 남는다. 자동 백업에는 ~/.my.cnf(권한 600)에 넣어 둔다.

4. 복제(Replication)

master/slave 설정, 복제 확인, 복제 깨짐 복구, 복제 지연 해결은 별도 글에 자세히 정리했다 → MySQL / MariaDB 복제(Replication) 정리 – 동작 원리, 설정, 복제 지연 해결

7. 성능 점검

MySQLTuner 를 받아 실행하면 현재 사용량을 보고 설정값을 추천해 준다.

관련 글: MySQL 튜닝 (from 나프다)