Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

23.7. 웹 애플리케이션과 ID 관리 스마트 카드 인증 통합

애플리케이션이 ID 관리 웹 인프라 Apache 모듈을 통해 인증 백엔드로 ID 관리 서버를 사용하는 개발자로서, 스마트 카드에 연결된 여러 역할 계정이 있는 사용자의 인증을 활성화하도록 애플리케이션을 구성할 수 있습니다. 이를 통해 이러한 사용자는 허용된 역할 계정에서 애플리케이션을 사용할 수 있습니다.

23.7.1. 스마트 카드로 웹 애플리케이션 인증 필수 조건

Apache 웹 애플리케이션이 실행 중인 서버에서 다음을 수행합니다.
  • ID 관리 도메인에 서버를 클라이언트로 등록합니다.
  • sssd-dbusmod_lookup_identity 패키지를 설치합니다.
  • Apache에 mod_nss 모듈을 사용하여 구성된 작동 HTTPS 연결이 있는지 확인합니다.

23.7.2. 웹 애플리케이션에 대한 ID 관리 스마트 카드 인증 구성

  1. /etc/httpd/conf.d/nss.conf 파일의 mod_nss 구성에서 TLS 재협정을 활성화합니다.
    NSSRenegotiation
    NSSRequireSafeNegotiation on
  2. mod_nss 인증서 데이터베이스의 클라이언트 인증서에 대해 사용자 인증서를 발행하는 CA가 신뢰할 수 있는지 확인합니다. 데이터베이스의 기본 위치는 /etc/httpd/alias 입니다.
  3. 웹 애플리케이션을 추가합니다. 이 절차에서는 로그인 페이지와 보호 영역으로 구성된 거의 최소한의 예를 사용하고 있습니다.
    • /login 엔드포인트는 사용자만 사용자 이름을 제공하고 사용자를 애플리케이션의 보호된 부분으로 보낼 수 있습니다.
    • /app 엔드 포인트는 REMOTE_USER 환경 변수를 확인합니다. 로그인에 성공하면 변수에는 로그인한 사용자의 ID가 포함됩니다. 그렇지 않으면 변수가 설정되지 않습니다.
  4. 디렉터리를 만들고 그룹을 apache 로 설정하고 모드를 최소 10.0.0.1으로 설정합니다. 이 절차에서는 /var/www/app/ 이라는 디렉토리를 사용하고 있습니다.
  5. 파일을 만들고 그룹을 apache 로 설정하고 모드를 최소 10.0.0.1으로 설정합니다. 이 절차에서는 /var/www/app/login.py 라는 파일을 사용하고 있습니다.
    다음 내용을 파일에 저장합니다.
    #! /usr/bin/env python
    
    def application(environ, start_response):
        status = '200 OK'
        response_body = """
    <!DOCTYPE html>
    <html>
        <head>
            <title>Login</title>
        </head>
        <body>
            <form action='/app' method='get'>
                Username: <input type='text' name='username'>
                <input type='submit' value='Login with certificate'>
            </form>
        </body>
    </html>
    """
        response_headers = [
            ('Content-Type', 'text/html'),
            ('Content-Length', str(len(response_body)))
        ]
        start_response(status, response_headers)
        return [response_body]
  6. 파일을 만들고 그룹을 apache 로 설정하고 모드를 최소 10.0.0.1으로 설정합니다. 이 절차에서는 /var/www/app/protected.py 라는 파일을 사용하고 있습니다.
    다음 내용을 파일에 저장합니다.
    #! /usr/bin/env python
    
    def application(environ, start_response):
        try:
            user = environ['REMOTE_USER']
        except KeyError:
            status = '400 Bad Request'
            response_body = 'Login failed.\n'
        else:
            status = '200 OK'
            response_body = 'Login succeeded. Username: {}\n'.format(user)
    
        response_headers = [
            ('Content-Type', 'text/plain'),
            ('Content-Length', str(len(response_body)))
        ]
        start_response(status, response_headers)
        return [response_body]
  7. 애플리케이션에 대한 구성 파일을 생성합니다. 이 절차에서는 /etc/httpd/conf.d/app.conf 라는 파일을 다음 콘텐츠와 함께 사용하고 있습니다.
    <IfModule !lookup_identity_module>
        LoadModule lookup_identity_module modules/mod_lookup_identity.so
    </IfModule>
    
    WSGIScriptAlias /login /var/www/app/login.py
    WSGIScriptAlias /app /var/www/app/protected.py
    
    <Location "/app">
        NSSVerifyClient require
        NSSUserName SSL_CLIENT_CERT
        LookupUserByCertificate On
        LookupUserByCertificateParamName "username"
    </Location>
    이 파일에서는 다음을 수행합니다.
    • 첫 번째 부분은 mod_lookup_identity 가 아직 로드되지 않은 경우 로드합니다.
    • 다음 부분에서는 /login/app 엔드가 해당 WSGI(Web Server Gateway Interface) 스크립트를 가리킵니다.
    • 마지막 부분에서는 TLS 핸드셰이크 중에 클라이언트 인증서가 필요하므로 /app 엔드 포인트에 대해 mod_nss 를 구성합니다. 또한 사용자의 ID를 조회하기 위해 선택적 요청 매개변수 사용자 이름을 구성합니다.