nginx basic auth 설정 구덩이 밟 기

nginx 의 basic auth 설정 은 ngxhttp_auth_basic_module 모듈 은 HTTP Basic Authentication 프로 토 콜 을 지원 합 니 다. 사용 자 는 이 설정 을 통 해 사용자 이름과 비밀 번 호 를 설정 하여 웹 사이트 에 간단 한 접근 제 어 를 할 수 있 습 니 다.
basic auth 설정 예제:
location / {
    auth_basic           "closed site";
    auth_basic_user_file conf/htpasswd;
}

설명:
  • auth_basic 는 off 또는 다른 문자열 로 설정 할 수 있 습 니 다. off 일 때 암호 인증 을 열지 않 음
  • auth_basic_user_file 은 사용자 이름과 비밀 번 호 를 포함 하 는 파일 입 니 다. elastic: YSEm9Tb 4. RwB 6
  • 와 같은 파일 내용 입 니 다.
    구 덩이 를 밟 는 곳 이 바로 이 비밀번호 입 니 다. 공식 문서 에서 지원 하 는 비밀번호 유형 에 대해 설명 하 였 습 니 다.
  • 시스템 함수 crypt () 암호 화 된 암 호 를 사용 합 니 다.htpasswd 명령 이나 openssl passwd 명령 으로 생 성 가능
  • 아파 치가 제공 하 는 MD5 기반 변종 암호 화 알고리즘 (apr 1) 은 htpasswd 또는 openssl passwd 명령 으로 생 성 할 수 있다
  • '{scheme} data' 형식 으로 표 시 된 암호 화 된 비밀번호, RFC 2307 에 서 는 이 형식의 암호 기준 에 대해 설명 했다.그 중에서 scheme 은 암호 화 알고리즘 을 말 하 는데 nginx 가 지원 하 는 scheme 은 PLAIN, SHA, SSHA 알고리즘 이 있 습 니 다.

  • htpasswd 나 openssl passwd 명령 으로 생 성 된 암 호 를 사용 하면 설정 이 유효 합 니 다. nginx 는 암호 보안 검 사 를 정상적으로 할 수 있 습 니 다. 암호 형식 이 지원 되 지 않 으 면 nginx 또는 오류 보고:
    crypt_r() failed (22: Invalid argument)
    

    그러나 업무 의 필요 로 인해 우 리 는 코드 로 nginx 의 설정 을 생 성하 고 모든 클 라 우 드 호스트 에 설정 한 다음 에 nginx 프로 세 스 를 끌 어 올 려 야 합 니 다.프로젝트 코드 는 go 언어 로 작성 되 기 때문에 대응 하 는 함수 나 라 이브 러 리 를 찾 아 nginx 가 지원 하 는 암 호 를 만들어 야 합 니 다.
    go 언어 는 nginx 가 지원 하 는 암 호 를 생 성 합 니 다.
    자동 생 성 암호 개발 을 진행 하기 전에 대략 세 가지 방안 이 실 현 될 수 있 을 것 이 라 고 생각 했다.
  • 프로젝트 서버 에 htpasswd 도구 나 openssl 을 설치 하고 코드 를 통 해 로 컬 명령 을 실행 하여 암호 화 암 호 를 생 성 합 니 다
  • Linux 시스템 함수 crypt () 암호 화 비밀번호 직접 호출
  • go 표준 라 이브 러 리 crypto 암호 화 비밀번호 사용
  • 우선, 첫 번 째 방식 은 바람 직 하지 않 습 니 다. 서버 환경 에 강하 게 의존 해 야 하기 때문에 직접 패스 합 니 다.다음은 두 번 째 와 세 번 째 방식 의 구체 적 인 실현 을 살 펴 보 자.
    시스템 함수 crypt 직접 호출 ()
    Linux 의 crypt 함 수 는 두 개의 인자 가 있 습 니 다. 함 수 는 다음 과 같이 정의 합 니 다.
    char *crypt(const char *key, const char *salt);
    

    그 중에서 매개 변수 key 는 암호 화 되 어야 하 는 내용 이 고 salt 매개 변 수 는 두 가지 유형 이 있 습 니 다.
  • 길이 가 2 인 문자열 입 니 다. 수치 범 위 는 [a - zA - Z0 - 9 /] 입 니 다. 두 자 리 를 넘 으 면 무시 되 고 최 장 8 비트 만 지원 할 수 있 습 니 다. key 가 8 자 리 를 넘 으 면 8 자 리 는 무시 됩 니 다
  • $id $salt $encrypted 형식 으로 다른 암호 화 알고리즘 을 지원 합 니 다. id 는 알고리즘 유형 을 표시 합 니 다. 구체 적 인 수 치 는 다음 과 같 습 니 다.
    ID  | Method
       ─────────────────────────────────────────────
       1   | MD5
       2a  | Blowfish (not in mainline glibc; added in some
           | Linux distributions)
       5   | SHA-256 (since glibc 2.7)
       6   | SHA-512 (since glibc 2.7)
    
  • go 언어 에서 import "C" 방식 으로 c 언어의 라 이브 러 리 함 수 를 직접 호출 할 수 있 습 니 다. 다음은 crypt 함수 의 구체 적 인 실현 입 니 다.
    package crypt
    
    /*
    #define _GNU_SOURCE
    #include 
    */
    import "C"
    
    import (
        "sync"
        "unsafe"
    )
    
    var (
        mu sync.Mutex
    )
    
    
    func Crypt(pass, salt string) (string, error) {
        c_pass := C.CString(pass)
        defer C.free(unsafe.Pointer(c_pass))
    
        c_salt := C.CString(salt)
        defer C.free(unsafe.Pointer(c_salt))
    
        mu.Lock()
        c_enc, err := C.crypt(c_pass, c_salt)
        mu.Unlock()
    
        if c_enc == nil {
            return "", err
        }
        defer C.free(unsafe.Pointer(c_enc))
    
        return C.GoString(c_enc), err
    }
    

    암호 생 성의 구체 적 인 실현:
    func main() {
        des, err := crypt.Crypt("Elastic123", "in")
        if err != nil {
            fmt.Errorf("error:", err)
            return
        }
    
        sha512, err := crypt.Crypt("Elastic123", "$6$SomeSaltSomePepper$")
        if err != nil {
            fmt.Errorf("error:", err)
            return
        }
    
        fmt.Println("des:", des)
        fmt.Println("SHA512:", sha512)
    }
    

    실측 을 통 해 상기 crypt 함 수 를 호출 하여 nginx 가 지원 하 는 암호 화 암 호 를 생 성 할 수 있 습 니 다. 그러나 주의해 야 할 것 은 암호 길이 가 8 자리 가 넘 으 면 salt 인 자 는 $id $salt $encrypted 형식 만 선택 할 수 있 습 니 다. 테스트 과정 에서 이 구 덩이 를 밟 아서 nginx 는 암호 의 8 자리 만 검사 할 수 있 고 어 이 없 기 때 문 입 니 다.
    go 코드 를 작성 하 는 과정 에서 C 함수 라 이브 러 리 를 호출 했 기 때문에 서버 가 처 한 환경 에 의존 해 야 하기 때문에 가장 좋 은 방법 은 go 표준 라 이브 러 리 의 함수 로 암 호 를 암호 화 하 는 것 입 니 다.
    crypto 함수 라 이브 러 리 사용
    go 의 crypto 표준 라 이브 러 리 는 많은 암호 화 알고리즘 을 봉 인 했 습 니 다. SHA 암호 화 알고리즘 을 사용 하여 암호 화 된 코드 는 다음 과 같 습 니 다.
    package util
    
    import (
        "crypto/sha1"
        "encoding/base64"
    )
    
    func GetSha(password string) string {
        s := sha1.New()
        s.Write([]byte(password))
        passwordSum := []byte(s.Sum(nil))
        return base64.StdEncoding.EncodeToString(passwordSum)
    }
    

    테스트 과정 에서 GetSha () 함 수 를 호출 하여 암호 화 된 문자열 을 만 들 었 습 니 다. 그러나 nginx 의 conf / htpasswd 파일 에 직접 설정 되 어 있 습 니 다. reload nginx 설정 후 암호 가 유효 하 는 지 테스트 한 결과 오류 가 발생 했 습 니 다. 앞에서 말 한 바 와 같이 SHA 암호 화 된 암 호 는 '{SHA}' 접두사 가 있어 야 합 니 다. 설정 을 다시 수정 한 후 검증 을 거 쳐 야 합 니 다.코드 로 nginx 가 지원 하 는 암호 화 문자열 을 성공 적 으로 만 들 었 습 니 다.

    좋은 웹페이지 즐겨찾기