먼저 저장공간을 확인

# df -Th

Filesystem Type Size Used Avail Use% Mounted on

devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev

tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm

tmpfs tmpfs 732M 75M 657M 11% /run

/dev/vda5 xfs 49G 4.7G 45G 10% /

/dev/vda2 xfs 936M 416M 521M 45% /boot

/dev/vda1 vfat 99M 7.1M 92M 8% /boot/efi

tmpfs tmpfs 366M 4.0K 366M 1% /run/user/1001

tmpfs tmpfs 366M 4.0K 366M 1% /run/user/0

저장공간이 충분하지 않을 경우

오래된 로그 파일을 삭제하거나 필요없는 백업 본을 삭제

# top -c

명령어를 통해 cpu mem의 사용률과 사용 중인 프로세스를 확인할 수 있음

만약 특정 프로세스의 cpu나 mem의 사용률이 높을 때 외부의 공격 의심

예를 들어 mysql과 nginx를 사용하고 있는 서버에 부하가 왔을 때

nginx를 이용해 웹서비스를 하고 있기 때문에 외부에서 들어오려면 nginx를 타고 DB 쪽으로 이동할 수 있는 가능성이 있음

(부하도도 nginx와 mysql이 높았음)

# grep "page=" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

명령어를 통해 웹 서비스에 접속한 IP를 확인

grep "page=" /var/log/nginx/access.log

-> nginx 접근 로그에서 URL 쿼리 스트링에 "page="가 포함된 요청만 불러오기

awk '{print $1}'

-> 로그 한 줄에서 첫 번째 필드만 출력(IP만 출력하게 설정)

sort

-> 사전순 정렬

uniq -c

-> 동일한 IP가 몇 번 나왔는지 숫자로 출력

ex) 532 123.45.67.89

uniq IP

sort -nr

-> 숫자로 정렬 및 내림차순 정렬

head -n 10

-> 상위 10개만 출력

위 명령어는 과거 로그를 집계해서 보여주는 명령어

# tail -F /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr

위 명령어처럼 -F 옵션을 넣어 실시간을 볼 수 있음

부하를 줄 정도로 많은 접속 내역이 있는 IP를 직접 차단하거나 해외에 서비스를 하지 않을 경우 해외 접속을 차단하는 방법도 있음

오래된 OS를 쓰는 서버에서 apache가 실행이 안되는 경우(CentOS 5 or CentOS 6)

원격 접속을 할 때 ssh 인증 방식이 달라 접속이 안될 경우가 있음

# ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa root@IP

위 명령어를 통해 오래된 ssh 방식을 사용해 접속할 수 있음

먼저 데몬이 잘 실행되고 있는지 확인

보통 # systemctl status httpd

를 입력하여 상태 확인을 할 수 있지만

# service httpd status

를 입력하여 상태 확인을 할 수 있음

만약 데몬이 잘 실행되고 있을 경우

서버의 저장공간이 부족하여 데몬이 작동하지 않을 수 있기 때문에

# df -Th

를 입력하여 내부 용량의 상태를 확인한 후 저장 공간이 부족할 경우 로그 파일이나 불필요한 백업본을 삭제

# top -c

를 통해 CPU나 Memory의 사용량을 확인

모두 정상적으로 보인다면 log 파일을 확인

/var/log/httpd에 로그 파일이 존재하기 때문에

(소스 설치의 경우 /usr 디렉토리 안에 있을 수도 있음)

# ll

로 수정된 일자를 확인하여 오늘 수정된 날짜의 파일 확인

만약 로그 파일에

[error] (28)No space left on device: Cannot create SSLMutex Configuration Failed

가 뜬다면

# ipcs -s | grep nobody | perl -e 'while (<STDIN>) { @a=split(/s+/); print `ipcrm sem $a[1]`}'

로 nobody 유저 소유의 SysV 세마포어를 전부 강제 삭제하여 오류를 해결

-> 세마포어= 프로세스 간 동기화 도구

이후

# service httpd restart

로 데몬 재시작