홍무 노트
홈페이지 사고 사례 요약 Nginx를 활용한 민감한 디렉터리 차단 및 보안 보호
사고 사례 요약

Nginx를 활용한 민감한 디렉터리 차단 및 보안 보호

Nginx를 활용한 민감한 디렉터리 차단 및 보안 보호

발생 원인

며칠 전 블로그에 백엔드 관리 기능을 추가했으며, SQLite 데이터베이스 디렉토리를 새로 도입했습니다. Mdata 캐시 디렉터리 Mcache기능이 정상적으로 작동한 후, 갑자기 한 가지 생각이 떠올랐다:

직접 접속할 경우 https://域名/Mdata/content.db어떤 일이 일어날까요?

해당 기능을 시도해 보니, 브라우저가 특정 파일을 다운로드하기 시작했고 — —— 데이터베이스 파일이 완전히 노출되었다. 이 파일에는 모든 게시물 내용, 사용자 비밀번호 해시값, 번역 캐시 등이 포함되어 있었으며, 만약 크롤러나 일반 사용자가 이 파일을 다운로드했다면 전체 사이트는 마치 투명한 유리창과도 같은 상태가 되었다.

이 글은 문제 진단 및 해결 과정을 기록하여 후속 사용자들에게 참고자료가 되도록 하려 합니다.

1. 먼저 폭발 여부를 확인하세요.

직관에만 의존하지 말고, 먼저 측정하세요. 사용하세요. curl 또는 브라우저에서 하나씩 접속할 수 있습니다:

curl -I https://你的域名/Mdata/content.db
curl -I https://你的域名/Mcache/_config.php
curl -I https://你的域名/Mdata/views.log
curl -I https://你的域名/Mdata/content.db-wal

반환된 HTTP 상태 코드를 확인하세요:

반환 코드의 의미 200 OK 위험문서가 공개적으로 다운로드되었습니다. 403 Forbidden 거절되었지만, 이는 경로의 존재를 드러냈습니다. 404 Not Found 이상적인 결과가 마치 그런 게 없었던 것과 같다면? 200이제 이 문제를 처리해야 합니다.

II. 왜 보타는 기본적으로 방어가 불가능한가?

Baota 패널의 기본 Nginx 설정에서 PHP 처리 규칙은 다음과 같습니다:

location ~ \.php$ {
    fastcgi_pass unix:/tmp/php-cgi-74.sock;
    include fastcgi.conf;
}

그것은 단지 관리만 하죠. .php 문서, 기타 확장명(.db.log.lock) 이는 정적 파일 처리 규칙을 따릅니다. 따라서 Nginx는 이를 일반 파일로 간주하여 사용자에게 전송합니다. content.db 그렇게 그냥 달리기 시작했다.

어떤 사람들은 이렇게 생각할 수 있습니다: "그건 어때요?" .db PHP 규칙에 추가하는 것으로 해결할 수 있을까요? 아닙니다. 그렇게 하면 Nginx가 PHP를 사용하여 이진 파일을 분석하려고 시도하게 되어 결과적으로 애니메이션 또는 500 오류가 발생합니다.

올바른 방법은독립적인 전фикс 매칭 규칙을 사용하여 전체 디렉터리를 제거합니다.

III. 핵심 구성 요소

Baota 패널을 열어 → 웹사이트 → 사이트를 클릭 → 구성 파일찾기 server {} 블록에 다음 내용을 추가하세요:

# 屏蔽数据与缓存目录
location ^~ /Mdata/ {
    return 404;
}
location ^~ /Mcache/ {
    return 404;
}

저장하면 Nginx가 자동으로 재로드됩니다. 그 네 개의 URL을 다시 확인해 보세요. 모두 정상적으로 응답을 반환할 것입니다. 404

이 두 가지로 문제를 해결했습니다.

IV. 보강: 전체 사이트에 적용

두 개의 디렉터리를 설정하는 것은 단지 시작점일 뿐입니다. 이에 따라 몇 가지 일반적인 규칙을 추가하여 더 다양한 상황을 포괄할 수 있습니다:

# ============ 安全加固 ============

# 屏蔽隐藏文件(放行 .well-known 给证书验证用)
location ~ /\.(?!well-known) {
    return 404;
}

# 屏蔽数据与缓存目录
location ^~ /Mdata/ {
    return 404;
}
location ^~ /Mcache/ {
    return 404;
}

# 屏蔽后台密钥 / 会话文件
location ~ ^/admin/_(key_.*|auth)\.php$ {
    return 404;
}

# 兜底:禁止访问任何数据库文件
location ~* \.(db|sqlite|sqlite3|db-wal|db-shm)$ {
    return 404;
}

# 禁止访问日志 / 锁文件
location ~* \.(log|lock)$ {
    return 404;
}

# 禁止访问备份 / 临时 / 配置文件
location ~* \.(bak|old|orig|save|swp|swo|tmp|inc|ini|conf)$ {
    return 404;
}

항목별 해설:

  1. 숨겨진 파일 규칙차단 .git.env.htaccess 이러한 종류의 문서.(?!well-known) 음성 선도적 주장으로, 부적절한 피해를 방지합니다. .well-known(Let's Encrypt를 이용한 SSL 인증서 발급용).
  2. 목차 차단Mdata / Mcache – 두 개의 핵심 디렉터리.
  3. 백엔드 파일 차단Madmin/_key_*.php 로그인 키가 저장되어 있습니다._auth.php 내부에 대화 토큰이 저장되어 있습니다. 콘텐츠가 주석으로 감싸여 있어 유출되지 않지만, 여전히 추가적인 보안 층이 존재합니다.
  4. 확장명(최종 대체 방안)어느 날 당신이 그것을 가져가게 되면요? Mdata 명칭 변경: 성 Data또는 다른 목록에도 포함되어 있을 수 있습니다. .db이 규칙은 여전히 막을 수 있습니다.
  5. 로그/잠금 파일views.logviews.lockphp_error.log 이러한 문서의 내용에는 IP 주소, UA, 오류 스택 등이 포함될 수 있습니다.
  6. 백업/임시 파일편집기(Vim / VSCode / PHPStorm)를 사용하여 생성합니다. .swp~.orig 이와 같은 사항에서 개발자가 코드를 수정할 때 삭제하지 않으면 원본 코드가 노출됩니다.

6. 관련 사항 403404 철학

안전 루프에는 이런 오래된 속담이 있습니다:

공격자에게 자신이 무엇을 잘못 했는지 말하지 마세요.

1개 403 Forbidden 이러한 반응은 스캐너에 "여기서 무언가가 있지만, 지금은 당신에게 제공하지 않습니다"라는 메시지를 전송하는 것과 동일합니다. 공격자의 다음 동작은 경로를 우회하거나 경로를 추정하거나 보안 취약점을 찾아내는 것입니다.

404 Not Found 침묵 — — — "당신이 보는 것과 내가 보는 것 사이에는 별 차이가 없다."

개인용 소규모 서버에 대한 공격에서는 공격자들이 반드시 '정밀 공격'을 수행하는 것은 아니며, 대부분 자동화된 스캐닝 방식을 사용합니다. 404 오류를 발생시키면 스캐너는 일반적으로 해당 요청을 간과합니다.

微信赞赏

위챗

支付宝赞赏

알리페이

✍️ 저자: 홍무

웹사이트 관리자 · 읽으셔서 감사합니다. 더 많은 흥미로운 콘텐츠를 확인하시려면 계속 방문해 주세요.

저자 프로필 홈페이지 보기 →

관련 기사

브라우저 캐싱을 활용하면 웹사이트를 다시 방문할 때 속도가 빨라집니다.

브라우저 캐싱을 활용하면 웹사이트를 다시 방문할 때 속도가 빨라집니다. 사고 사례 요약

브라우저 캐싱에 관한 공식 안내: 사용자가 동일한 웹사이트를 여러 차례 방문하는 경우, 정적 자원에 대한 브라우저 캐싱은 사용자의 시간을 절약할 수 있습니다. 캐싱 헤더는 소수의 정적 자원(예: 이미지)에만 적용하는 대신, 모든 캐싱 가능한 정적 자원에 적용되어야 합니다. 캐싱 가능한 자원에는 JS 및 CSS 파일, 이미지 파일, 기타 이진 파일(미디어 파일 및 PDF 파일 등)이 포함됩니다. 일반적으로 HTML은…
👁 207
일반적인 정규식

일반적인 정규식 사고 사례 요약

정규 표현식 – URL: [a-zA-z]+: // [^\s]* – IP 주소: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}((2[0-4]\d|25[0-5]|[01]?\d\d?)) – 이메일: \w+([-+。\w+])*@ \w+([-。\w+])*…
👁 249

추천 읽을거리

Apple CMS 메시지 게시판 태그

Apple CMS 메시지 게시판 태그 프로그램 노트 Apple CMS

메시지 게시판 태그 – 적용 범위: 전체 사이트의 모든 위치에서 사용 가능 | 태그 기능: 사용자가 메시지를 제출하거나 메시지 기록을 조회하는 데 사용됩니다. 1. 메시지 제출 양식 <form action="{pboot:msgaction}" method="post"> 연락처: <input type="…”>
👁 459
PHP를 이용한 원격 다운로드 및 압축된 PHP 파일을 일시적으로 참조하며, 스크립트 실행이 종료되면 해당 참조 파일을 자동으로 삭제합니다.

PHP를 이용한 원격 다운로드 및 압축된 PHP 파일을 일시적으로 참조하며, 스크립트 실행이 종료되면 해당 참조 파일을 자동으로 삭제합니다. 언어 노트 PHP

PHP의 `tempnam()` 함수를 사용하여 임시 파일 이름을 생성하고 해당 파일 이름을 반환한 후, 원격 서버에서 다운로드한 압축된 PHP 파일을 이 파일 이름으로 지정된 경로에 해제할 수 있습니다. 파일을 해제한 후에는 `require_once` 또는 `include_once` 함수를 사용하여 해당 임시 파일을 스크립트 내에서 참조할 수 있으며, 스크립트 실행 종료 후에는 `unlink()` 함수를 사용하여 이 임시 파일을 삭제할 수 있습니다. 다음은 예시 코드입니다…
👁 202
실용적인 도구: Nginx 웹사이트 로그 분석

실용적인 도구: Nginx 웹사이트 로그 분석 실용적인 저장하기 실용적인 도구

명칭에서 알 수 있듯이, 이는 간단한 로그 분석 도구로, 귀하의 웹사이트 로그에 포함된 구체적인 정보를 분석할 수 있습니다! 첫 번째 단계: 로그 파일과 도구를 동일한 디렉터리에 배치 – 본 프로그램의 디렉터리 내에 Log 로그 파일(NGINX 웹사이트 로그)을 추가하거나, 프로그램을 복사/이동하여 로그 파일이 저장되는 디렉터리로 옮깁니다. 두 번째 단계: 로그 파일 이름 수정 – 웹사이트 로그 파일의 이름을 `rizhi.log`로 변경하십시오. 그렇지 않으면 프로그램이 자동으로…
👁 188
PHP를 사용하여 지정된 디렉터리 내의 특정 확장명을 가진 파일을 삭제합니다.

PHP를 사용하여 지정된 디렉터리 내의 특정 확장명을 가진 파일을 삭제합니다. 언어 노트 PHP

PHP의 `glob` 함수를 사용하여 지정된 디렉터리 내의 파일 이름을 검색하고, `unlink` 함수를 사용하여 해당 파일을 삭제할 수 있습니다. 구체적인 작업 절차는 다음과 같습니다: `glob` 함수를 사용하여 지정된 디렉터리 내의 파일 이름을 검색하여 배열로 저장합니다. 코드는 다음과 같습니다: `$files = glob('/path/to/dir/*.txt');` 여기서 `/path/to/dir`는 작업 대상 디렉터리를 나타냅니다…
👁 245