Virtual Server에 BIG-IP 인증

7987 단어 big-ipiRule
개시하다
이 페이지에는 Virtual Server(HTTP or HTTPS)에 대한 액세스를 BIG-IP에서 BASIC 인증하는 방법이 나와 있습니다.BASIC 인증은 안전성에 있어서 어떤 것입니까? 저도 모르는 것은 아니지만 찾아보니 더 필요한 것 같습니다.적어도 통신 경로는 반드시 암호화해야 한다.
BASIC 인증은 Apache 또는nginx라면 conf 파일을 통해 간단하게 진행할 수 있지만 BIG-IP에는 iRule이 필요합니다.또한 사용자 이름과 암호를 저장하기 위해 Data Group List도 사용됩니다.
참조 정보
  • DevCentral: HTTP Basic Access Authentication iRule Style
  • DevCentral: iRules 101 - #17 – Mapping Protocol Fields with the Binary Scan Command
  • DevCentral: Advanced iRules: Getting Started with iRules Procedures
  • DevCentral: iRules Wiki: HTTP::username
  • DevCentral: iRules Wiki: HTTP::password
  • 컨디션
    이 페이지에 기재된 iRule은 v12입니다.1.2 동작을 확인한다.
    iRule
    액션
    iRule은 다음 작업을 수행합니다.특별히 조목조목 열거한 것은 매우 일반적인 BASIC 인증이다.
  • BIG-IP에 액세스하는 Virtual Server의 특정 디렉터리 속(이곳은/mgmt/) 시 BASIC 인증
  • BIG-IP에서 인증에 필요한 사용자 이름과 비밀번호(sha256 암호 해시 후 문자열)를 데이터 그룹 목록으로 미리 등록
  • BIG-IP가/mgmt/로 시작하는 URL에 액세스할 때 BASIC 인증 정보(사용자 이름과 비밀번호)가 없으면 401 Unauthorized
  • 에 응답
  • BASIC 인증 정보가 BIG-IP에 등록된 Data Group List의 사용자 이름 및 암호와 일치하는 경우 Pool에 통신 할당
  • 이 페이지의 견본에서 인증용 사용자 이름과 비밀번호는'사명:admin, 비밀번호:admin'이다.
    코드
    proc basic_auth {} {
        binary scan [ sha256 [HTTP::password]] H* password
        if { [class lookup [HTTP::username] authorized_users] ne $password } {
            log local0. "User [HTTP::username], has been denied access to virtual server [virtual name]."
            HTTP::respond 401 WWW-Authenticate "Basic realm=\"Secured Area\""
        }
    }
    
    when HTTP_REQUEST {
        if {[HTTP::uri] starts_with "/mgmt/"} {
            call basic_auth
        }
    }
    
    Data Group List
    Data Group list 이름 "authrized users"를 만들고 사용자 이름과 비밀번호 "admin"을 sha256 산열한 값을 저장합니다.
    이 화면은 GUI 화면(Configuration Utility)에서 사용할 수 있습니다.

    여러 사용자를 등록하려면 데이터 그룹 목록에 레코드를 추가합니다.
    BIG-IP bash를 사용할 경우 다음 명령을 사용하여 암호 SHA256 해시 변환을 수행할 수 있습니다.
    $ echo -n "admin" | sha256sum 
    8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918  -
    
    
    Virtual Server
    이 iRule은 Virtual Server에 적용됩니다.이것에 관해서는 특별히 쓸 것이 없다.
    동작 확인
    우선 일반적인 페이지 (/index.}) 에 접근하는 경우입니다.
    $ curl -i http://203.0.113.1/index.html
    
    HTTP/1.1 200 OK
    Content-Type: text/html
    Accept-Ranges: bytes
    Content-Length: 23
    Server: lighttpd/1.4.45
    
    This is a test server.
    
    인증 없이 원활하게 액세스할 수 있습니다.
    이어서 BASIC 인증이 필요한 디렉터리 산하 (/mgmt/index.>) 에 인증이 없는 접근을 했습니다.
    $ curl -i http://203.0.113.1/mgmt/index.html
    
    HTTP/1.0 401 Unauthorized
    WWW-Authenticate: Basic realm="Secured Area"
    Server: BigIP
    Connection: Keep-Alive
    Content-Length: 0
    
    BIG-IP 응답, 401 응답
    다음에 인증용 사용자 이름과 비밀번호를 입력하십시오. 접근할 때 비밀번호가 잘못되었습니다.
    $ curl -i -u admin:admin2 http://203.0.113.1/mgmt/index.html
    
    HTTP/1.0 401 Unauthorized
    WWW-Authenticate: Basic realm="Secured Area"
    Server: BigIP
    Connection: Keep-Alive
    Content-Length: 0
    
    여전히 401이 계속 응답하고 있다.참고로 상술한 두 차례의 방문은 BIG-IP의/var/log/ltm에서 다음과 같은 느낌으로 기록되었다.
    info tmm[17378]: Rule /Common/Sample_Basic_Auth <HTTP_REQUEST>: User , has been denied access to virtual server /Common/vs_public.
    info tmm[17378]: Rule /Common/Sample_Basic_Auth <HTTP_REQUEST>: User admin, has been denied access to virtual server /Common/vs_public.
    
    Sample_Basic_Auth는 아이룰의 이름, vspublic은 Virtual Server의 이름입니다.
    마지막으로 정확한 사용자 이름과 비밀번호로 접근할 때.
    $ curl -i -u admin:admin http://203.0.113.1/mgmt/index.html
    
    HTTP/1.1 200 OK
    Content-Type: text/html
    Accept-Ranges: bytes
    Content-Length: 32
    Server: lighttpd/1.4.45
    
    This page needs authentication.
    
    BIG-IP 인증을 통해 서버의 응답을 받았습니다.
    해설
    proc 정보
    proc는 tcl로 하위 루틴 (함수) 을 만드는 명령입니다.tcl에서 서브루틴은'과정'이라고 불리기 때문에 여기를 과정이라고 부른다.
    과정은 다음과 같은 문법이다.
    proc プロシジャ名 {引数1 引数2 ...} {
        プロシジャ内の処理...
    
        # 特定の値を返したい場合はreturnを使う
    }
    
    # プロシジャを実行する際はcallを使う
    call プロシジャ名 引数1 引数2 ...
    
    일반적인 프로그래밍 언어의 함수와 마찬가지로 매개 변수와 반환 값을 이용할 수 있지만 이번에 사용한 프로그램은 필요하지 않아 사용하지 않았다."return"을 사용하지 않으면, 프로그램이 끝날 때, 프로그램에서 마지막으로 실행한 명령의 반환 값은 프로그램의 반환 값입니다.
    파라미터가 0일 때, 프로그램이 정의할 때 'proc 프로세스 이름 {}' 과 파라미터에 상공 목록 {}을 추가해야 하는지 알고 싶지만, 참고 이 페이지(wiki.tcl.tk) 를 참고하여 빈 목록을 열거하기로 결정했습니다.그러나 DevCentral의 페이지에는 일반적으로 파라미터가 없는 과정 ({}만 쓰지 않음) 의 샘플 코드가 있기 때문에 최소한iRule에는 빈 목록을 쓰지 않아도 됩니다.
    프로크의 흥미로운 점은 BIG-IP의 실현이 의외로 최근(v11.4 이후)이라는 점이다.참조 정보를 제공하는 proc의 설명 페이지에서 "Ladies and gentlemen, proces are now supported in iRules'크다'라고 쓰여 있는데 그 전에 얼마나 많은 사람들이 기대하고 있을까 싶어요.프로그래밍 언어에서 하위 루틴을 만드는 것은 당연한 일이지만 아이룰에서 그것을 실행하는 것은 쉬운 일이 아닌 것 같다.
    proc로 제작된 프로그램은 같은 iRule에서 호출할 수 있을 뿐만 아니라 외부의 iRule에서도 호출할 수 있다.프로크에 관해서는 다음에 다른 페이지를 만들고 싶습니다.
    [HTTP::usename] 및 [HTTP:password] 정보
    이러한 명령을 사용하면 HTTP Basic 인증을 받은 사용자 이름과 암호를 얻을 수 있습니다.자세한 내용은 DevCentral 을 참조하십시오.
    HTTP Basic 인증에서 이 정보는 클라이언트에서 서버로 통신할 때 BASE64로 인코딩되지만 HTTP:usename]와 [HTTP:password]가 디코딩한 값을 되돌려주기 때문에 디코딩 처리를 할 필요가 없습니다.
    암호는 해시 값으로 저장됩니다
    Data Group List에는 암호를 해싱한 값이 저장되어 있지만 Basic 인증에서 암호는 기본 64 인코딩 문자열에 불과하며 통신 경로의 감청에 해싱은 의미가 없습니다.나는 통신 경로의 안전성은 HTTPS화를 통해 대응해야 한다고 생각한다.
    Apache와nginx에서 암호 정보는 일반적으로 산열되기 때문에 iRule도 산열된다.
    "비밀번호 정보(Apache가 말한 htpasswd)가 유출되면 어떻게 하나요?"라는 점은 확실히 산열된 뜻이 있지만, 처음에 이 데이터 그룹을 저장한 것은bigip의 설정 파일bigip이다.conf입니다. 만약 이 파일이 외부로 유출된다면 Basic 인증의 비밀번호는 소동을 일으키지 않을 것입니다.하지만 그래도 안 하는 것보다 낫다고 생각해요.
    Data Group List를 외부 파일 참조(external)로 사용하는 경우 해싱의 가치가 더 높습니다.
    DevCentral의 샘플 코드에서md5를 산열로 하였으나 시대의 흐름을 고려하여sha256을 산열로 결정하였다.이 점에 관해서는 샘플 코드의 "md5"를 "sha256"로 바꿀 뿐입니다.
    면책 사항
    본 페이지의 내용에 착오가 있으면 참고인이 어떠한 손실을 입었을 때에는 일체 책임을 지지 않습니다.

    좋은 웹페이지 즐겨찾기