Apache 에러 로그가 0바이트인데 계속 쓰고 있었던 이유: 지워진 inode
로그 로테이션 뒤 Apache가 지워진 파일에 계속 에러를 쓰고 있어 로그가 0바이트로 보였던 사례와, /proc/<pid>/fd로 진짜 로그를 읽고 다시 정상화한 방법입니다.
SELF-HOSTED NAS NOTES
집에 있는 NAS 한 대로 워드프레스와 개인 서비스를 운영하면서 겪은 랜섬웨어 감염, 해킹 정리, 느려진 사이트, 끊기는 연결을 원인을 찾은 순서대로 기록합니다.
사진 23,015개가 .encrypt로 암호화된 시놀로지 NAS에서 랜섬노트, 파일 시간, 암호화 구조로 eCh0raix 후기 변종을 가려내고 원본을 찾아본 과정입니다.
읽기로그 로테이션 뒤 Apache가 지워진 파일에 계속 에러를 쓰고 있어 로그가 0바이트로 보였던 사례와, /proc/<pid>/fd로 진짜 로그를 읽고 다시 정상화한 방법입니다.
워드프레스 3곳이 서로 다른 버전에서 멈춘 원인을 auto_core_update_failed 기록에서 찾아 파일 소유권, auto_update_core_major 옵션, 방문자 없는 사이트의 wp-cron 문제를 고친 과정입니다.
DSM에서 Let's Encrypt 인증서가 갱신됐는데도 Web Station 사이트 하나가 옛 인증서를 내보낸 원인(보관함과 배포 사본의 불일치)과 수동 재배포, 재발 대비 방법입니다.
DSM 7.3 업그레이드에서 MariaDB 10.3→10.11 mysql_upgrade 90분, PHP 7.4·8.0 제거, Docker 24 전환, 패키지 status 259·272 대응까지 실제로 손본 것을 정리했습니다.
사이트 22개와 워드프레스 8개 점검에서 나온 노출 파일(.bak 소스, DB 덤프, phpinfo, Duplicator 설치기)과, 찾는 명령, uploads PHP 실행·xmlrpc 차단 규칙과 응답 확인 결과입니다.
인터넷에 열려 있던 MariaDB를 bind-address=127.0.0.1로 막기 전에 TCP 클라이언트, 웹사이트의 소켓 접속, Docker 컨테이너의 DB 사용 여부를 확인한 순서와 적용·되돌리기 방법입니다.
wp-config.php의 add_filter 때문에 WP-CLI가 뜨지 않는 사이트 7곳에서, 직렬화 길이를 깨지 않고 이메일을 43행 치환한 PHP 스크립트의 핵심과 백업·검증 방법입니다.
akismet, wordpress-seo 같은 이름의 빈 플러그인 폴더에 숨김 .ico 확장자로 심어진 PHP 파일이 4년 동안 발견되지 않은 이유와 찾는 명령, 함께 나온 Duplicator 설치기 흔적입니다.
*.도메인 CNAME이 없는 서브도메인까지 Web Station 기본 페이지를 200으로 내보내던 문제를, 실패한 .htaccess 시도부터 안내 페이지 교체, 개별 CNAME 전환, www 301까지 정리한 기록입니다.
시놀로지에서 sed -i로 설정 파일 13개를 고쳤더니 ACL이 사라져 권한이 000이 되고 사이트가 500을 낸 원인, 복구 방법, inode를 유지하는 수정 방식과 busybox grep --include 함정을 정리했습니다.
파일 수정 시각 기준 점검이 정상 업데이트에는 경고하고 4년 된 웹셸은 놓친 이유와, wordpress.org 체크섬 API로 코어 변조와 낯선 파일을 찾는 PHP 코드, 그 한계를 정리했습니다.
Cloudflare 5xx가 섞여 나올 때 NAS 직결 측정, 서버 로그, ICMP 손실, 스캐너 몰림 시각을 비교해 공유기 인바운드 구간의 세션 단위 끊김으로 좁히고 20초 프로브로 확인한 기록입니다.
PHP 사이트 23개가 한 프로파일을 쓰던 Web Station에서 opcache 적중률 45.8%를 확인하고, user_settings.ini와 PHPSettings.json을 함께 고쳐 512MB로 늘린 뒤 TTFB가 0.3~0.45초로 줄어든 기록입니다.
세 번 감염된 가족 블로그를 재설치하지 않고 격리, 코어 원본 교체, mu-plugins 백도어 제거, 가짜 관리자 삭제, 솔트 재생성 순서로 정리해 글 79개와 첨부 2,443개를 지킨 기록입니다.
엔트로피, JPEG 바이트 스터핑(FF00) 비율, IV 중복 검사로 eCh0raix 암호화 파일에 부분 암호화나 IV 재사용 같은 빈틈이 있는지 판별한 방법과 검사 스크립트입니다.
Apache 2.4에서 2.2 문법 Order 구문이 500을 내는 것을 재현하고, 그 .htaccess가 SEO 스팸 해킹이 남긴 흔적이었던 사례와 500을 고치기 전에 확인할 것들을 정리했습니다.
my.cnf에 3GB로 적은 innodb_buffer_pool_size가 16MB로 돌던 원인이 시놀로지가 관리하는 synology.cnf였던 과정과, 확인·변경 방법, 적중률 85%에서 98.5%로 바뀐 결과입니다.
글 페이지는 빠른데 wp-login과 wp-admin만 2~12초 걸린 원인을 구간별로 재서 DB 쓰기 fsync와 Photos 인덱싱의 디스크 포화로 좁히고 MariaDB 설정으로 0.1초대로 되돌린 기록입니다.
Go math/rand의 시드가 2³¹-1 공간으로 줄어드는 점을 이용해 eCh0raix 키 후보를 4가지 방식 × 6가지 문자 집합으로 86분 동안 전수 탐색한 방법과 결과입니다.
사진 23,015개가 .encrypt로 암호화된 시놀로지 NAS에서 랜섬노트, 파일 시간, 암호화 구조로 eCh0raix 후기 변종을 가려내고 원본을 찾아본 과정입니다.
headless Chrome은 390px 창을 500px로 올려 렌더링합니다. 직접 잰 값과 CDP setDeviceMetricsOverride로 모바일 폭을 고정하는 의존성 없는 Node 스크립트를 정리했습니다.
PHP 파일 하나로 만든 사이트에서 sitemap과 canonical이 어긋나지 않게 주소 규칙을 한곳에 두는 방법과, 배포 때마다 돌리는 Python 점검 스크립트 전체를 정리했습니다.
Cloudflare가 mailto 링크를 /cdn-cgi/l/email-protection으로 바꿔 링크 점검에 404가 잡힌 원인과, 세 가지 해결 방법 중 email_off 주석으로 두 링크만 뺀 과정입니다.