Category: Nginx

  • CVE-2026-42945

    nginx 와 관련된 보안 문제라고 한다. 최신 버전에서 해결되었다고 한다. 1.30.1 이전 버전이 해당 대상이라고 한다. 나는 사용하지 않는 명령어라서 괜찮을 것이다.

    그런데 데비안 공식저장서는 버전이 잘 바뀌지 않는다. 그래도 걱정할 필요는 없다.

    우선 지금 사용하는 버전을 정확하게 알려면 다음과 같이 한다.

    apt policy nginx

    다음 명령어를 이용하면 현재 적용된 변경 사항들을 알 수 있다.

    apt-get changelog nginx

    1.22.1-9+deb12u7 에는 CVE-2026-42945 패치가 적용된 것을 알 수 있다.

  • 인증서 갱신

    와일드 카드 인증서와는 달리 단일 도메인 인증서는 DNS 를 이용한 인증을 하지 않는다. 하지만 80번 포트는 필요하다. 그래서 미크로틱에 NAT를 임시로 추가했다. 명령어는 와일드 카드 인증서 받을 때와 크게 차이나지 않는다.

    sudo certbot certonly --force-renewal -d www.meilleursolution.com

    명령어를 실행하면 다음의 3가지 선택 메뉴가 나타난다. 1번을 해도 무방하다.

  • token을 이용한 접속 제한

    투자 포트폴리오를 파이 차트로 만들었다. 보고 있으면 기분이 좋다. 하지만 다른 사람이 보는 것은 싫다. IP기반으로 차단을 하고 있다. 그런데 회사 내라면 모든 PC에서 가능하다. 코파일럿을 이용해서 검색했다. 쉽고 간단한 방법을 선택해서 적용했다.

    http 블록에서 map 을 이용해서 token 이 있으면 allow_access 변수에 1, 아니면 0을 지정한다.

    map $arg_token $allow_access {
    		default 0;
    		"my_token" 1;
    }

    서버 블록에서 다음과 같이 설정한다. 토큰이 없는 0의 값이면, drop 효과가 있는 444 응답 코드를 적용했다.

    location /asset/ {
    	if ($allow_access = 0) {
    		return 444;
    	}
    }

    이러면 다음과 같이 하면 접속할 수 있다.

    https://www.welovedoctor.com/asset/index.html?token=my_token

    index.html 파일에는 png 파일을 볼 수 있는 내용이 있다. 하지만 화면에서 그림 파일을 볼 수 없다.

    다음과 같이 index.html 파일의 내용을 수정한다.

    <img src="asset.png?token=my_token">

  • AbuselPDB로 신고하기

    nginx의 error.log 에 있는 ip 접근은 raw filter를 이용해서 효과적으로 걸러지고 있는 것 같다.

    abuselPDB에 이 ip를 신고하는 과정을 구현했다. 역시 코파일럿 도움으로 말이다.

    아래가 샘플 코드이다.

    # POST the submission.
    curl https://api.abuseipdb.com/api/v2/report \
      --data-urlencode "ip=127.0.0.1" \
      -d categories=18,22 \
      --data-urlencode "comment=SSH login attempts with user root." \
      --data-urlencode "timestamp=2023-10-18T11:25:11-04:00" \
      -H "Key: YOUR_OWN_API_KEY" \
      -H "Accept: application/json"

    python에서 하기 위해 다음과 같이 한다.

    url = "https://api.abuseipdb.com/api/v2/report"
    headers = {
    	"Key": abuseipdb_key,
    	"Accept": "application/json"
    }
    data = {
    	"categories": "19"
    }
    params = {
    	"ip": input_ip,
    	"comment": "SSL_do_handshake() failed"
    }
    response = requests.post(url, headers=headers, data=data, params=params)