rsyslog의 TLS(SSL)를 통한 안전한 송수신(암호화 및 인증)

9196 단어 syslogrsyslog
개시하다
이 기사는 rsyslog의 TLS(Secure Surgent) 기반 보안 송수신에 관한 기사입니다.
마지막으로 rsyslog의 TLS(SSL)를 통한 안전한 송수신(암호화만)에서 Syslog 통신을 암호화했습니다.하지만 터미널은 인증되지 않았다.
이렇게 하면 도청을 방지할 수 있지만 사칭을 방지할 수 없기 때문에 고객 단말기의 인증 설정을 한다.
인증 환경은 계속해서 CentOS 8 및 Ubuntu(18.04)입니다.
Syslog 전송 측면(클라이언트): CentOS(rsyslog version 8.37.0), IP = 192.168.0.15
syslog 수신 측면(서버): Ubuntu(rsyslog version 8.32.0), IP = 192.168.0.13
마지막 확인
지난번 글에서 만든 기밀 키와 인증서는 다음과 같습니다.
  • 개인용 CA(인증서)의 개인 키와 인증서
  • ca-key.pem
  • ca.pem
  • 서버의 기밀 키 및 인증서
  • server-key.pem
  • server-cert.pem
  • 고객 기밀 키, CSR 및 인증서 작성
    터미널 인증은 클라이언트 인증서가 필요하기 때문에 저희는 이 인증서를 만들 것입니다.
    서버와 마찬가지로 프로그램은 다음과 같습니다.
    1. 터미널에 기밀 키 만들기
    2. 개인 키 기반 인증서 서명 요청: CSR을 만들어 인증국(CA)에 보내기
    3. 인증서(CA)가 CSR에서 인증서를 만들고 터미널로 전송
    개인 키 생성
    클라이언트 터미널로 기밀 키를 만들까 서버 터미널로 만들까1고민 중입니다. 제 비밀 키는 직접 만들어야 하기 때문에 클라이언트 터미널로 만들었습니다.
    $ sudo certtool --generate-privkey --outfile client-key.pem
    

    CSR 만들기
    개인 키를 사용하여 인증서 서명 요청: CSR(Certficate Signing Request)을 만듭니다.
    $ sudo certtool --generate-request --load-privkey client-key.pem --outfile client-request.pem
    
    이번에도 다양한 정보를 요청받고, 이것도 이쪽 문서를 참고해서 만들 거예요.Generating the machine certificate
    여기서 중요한 것은 Common name입니다.호스트가 DNS를 등록할 때 사용됩니다.사용하지 않더라도 FQDN 형식의 호스트 이름이 필요합니다.
    Common name: client.example.jp
    Organization unit name: SomeOU
    Organization name: SomeOrg
    Locality name: Chiyoda-ku
    State or province name: Tokyo
    Country name(2 chars): JP
       # 途中はすべてデフォルト値
    Is this a TLS web client certificate? (y/N): y
    Is this also a TLS web server certificate? (y/N): y
    

    인증서 작성
    이전에 제작한 CSR을 CA가 담당하는 터미널에 전달합니다.
    전송 시 읽기 권한이 필요할 때 추가됩니다.
    $ sudo chmod +r client-request.pem
    

    다음은 인증서(CA)의 업무 부분입니다.
    전달된 클라이언트 CSR을 사용하여 클라이언트 인증서를 만듭니다.
    실행하기 전에 다음 서류가 완비되었는지 확인하세요.
  • client-request.pem
  • ca.pem
  • ca-key.pem
  • $ sudo certtool --generate-certificate --load-request client-request.pem --outfile client-cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
    
    기한을 물어야 하기 때문에 먼저 3600일로 정했다.
    (CA의 기한은 3650일이기 때문에 더 적은 날이 좋다는 뜻)
    The certificate will expire in (days): 3600
    

    확장된 곳은 이번에는 다음과 같다.서버와 달리 클라이언트 이름과 IP 모두 변경될 가능성이 높아 설정하지 않습니다.
    Does the certificate belong to an authority?(y/N): n
    Is this a TLS web client certificate? (y/N): y
    (略)
    Is this a TLS web server certificate? (y/N): y
    
    

    최종적으로'Is the above information ok'로 확인되므로 y를 입력합니다.
    클라이언트 인증서를 만듭니다.

    client-cert.pem이 존재하면 성공합니다.

    생성된 client-cert.pem을 고객 터미널에 전달합니다.

    키 및 인증서의 권한 및 구성
    전송된 파일은 이동할 때의 계정 권한이기 때문에 루트 권한으로 변경하여 지난번에 만든 폴더로 이동합니다.
    $ sudo chown root:root client-cert.pem
    $ sudo chmod 644 client-cert.pem
    $ sudo mv client-cert.pem /etc/rsyslog.d/tls
    $ sudo mv client-key.pem /etc/rsyslog.d/tls
    

    권한을 확인하다.

    rsyslog 설정
    서버 측 rsyslog 설정
    클라이언트 인증을 위해 Authmode="x509/name"로 변경하고 PermittedPeer=["client.example.jp"]를 추가합니다.
    module(
     load="imtcp"
     StreamDriver.Name="gtls"
     StreamDriver.Mode="1"
     StreamDriver.Authmode="x509/name"
     PermittedPeer=["client.example.jp"]
    )
    

    다시 시작하여 상태를 확인합니다.
    $ sudo systemctl restart rsyslog.service
    $ sudo systemctl status rsyslog.service
    
    이렇게 하면 고객측에 인증 오류가 발생했음을 알 수 있다.터미널 인증이 설정되어 있기 때문입니다.실제로 이 상태에서는 로그 전송을 할 수 없다.

    클라이언트의 rsyslog 설정
    그러면 로그 전송을 다시 할 수 있도록 클라이언트의rsyslog를 설정합니다.
    서버 측의 설정과 같이 인증서 파일별로 Authmode와 PermittedPeers를 설정합니다.2
    global(
     DefaultNetstreamDriver="gtls"
     DefaultNetstreamDriverCAFile="/etc/rsyslog.d/tls/ca.pem"
     DefaultNetstreamDriverCertFile="/etc/rsyslog.d/tls/client-cert.pem"
     DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/tls/client-key.pem"
    )
    
    module(
     load="imtcp"
     StreamDriver.Name="gtls"
     StreamDriver.Mode="1"
     StreamDriver.Authmode="x509/name"
     StreamDriverPermittedPeers="server.example.jp"
    )
    


    재부팅하여 문제가 발생했는지 확인합니다.
    클라이언트
    $ sudo systemctl restart rsyslog.service
    $ sudo systemctl status rsyslog.service
    
    로그 전송과 사칭할 수 없음 확인
    클라이언트가 로그 전송을 하는지 확인합니다.


    로그 전송이 완료되었는지 다시 확인할 수 있습니다.
    그럼 정말 사칭하면 안돼요?
    다른 고객 단말기를 준비하여 인증이 가능한지 확인하세요.
    다른 고객 단말기 자체를 인증국(CA)으로 설정하고 제 인증서를 제작하며 같은 설정의 고객 인증서를 만들고 이 인증서를 사용하여 인증 설정을 합니다.rsyslog.conf는 정규 고객 단말기에서 복사됩니다.
    로그에서 보듯이, 시작할 때 (start) 'unexpected gnuls error' 가 발생했습니다.

    서버의 ca.pem 및 ca-key입니다.확인했습니다.
    ca.pem은 나눠줄 수 있어요,ca-key.나는pem의 중요성을 잘 안다.
    이렇게 하면 허용된 단말기 이외의 단말기를 연결할 수 없어 사칭을 방지할 수 있다.
    참고 자료
  • Generating the machine certificate
  • RSyslog Documentation Setting up a client
  • 예를 들어 참고서인 에서 서버 단말기에서 클라이언트의 기밀 키와 인증서를 제작하여 클라이언트에 전달한다
    이 문서Setting up a client를 참고하여 인증 파일을 설정하면 Authmode는'anon'상태를 유지하고 PermittedPeers의 설정이 없어도 전송할 수 있습니다.서버 쪽에서 설정하면 자동으로 전환되나요?몰라. 

    좋은 웹페이지 즐겨찾기