Thursday, May 4, 2017

Azure 클라우드 네트워킹 (원제: Networking to and within the Azure Cloud)

Azure 클라우드에서의 네트워킹



 하이브리드 네트워킹을 어떻게 정의해야 것인가. '가상네트워크로의 연결'이라는 맥락에서 정의한다면 이는 ExpressRoute 프라이빗 피어링이나 VPN 연결 같이 프레미스 자원과 하나 이상의 가상네트워크(VNet)들의 연결이라 있다.   모든 것들은 작동하고 있으며 우리는 이것들을 어떻게 사용하는지 알고 있지만, 이것들은 클라우드 안에서 대체 어떻게 움직이는 것일까. 여기에는 Azure 내장된 가지 이상의 방식이 작동한다.   포스팅을 통해 그것들을 간략하게나마 설명하고자 한다.
  • 하이브리드 네트워킹 연결 옵션
  • 클라우드 내부 연결 옵션
  • 옵션 종합


하이브리드 네트워킹 연결 옵션


기본적으로 4 가지 옵션이 있다.
  • 인터넷 연결
  • 사이트 연결 VPN (Point-to-site VPN)
  • 사이트 연결 VPN (Site-to-Site VPN)
  • ExpressRoute
인터넷 연결
 이름 그대로, 인터넷 연결은 가상 네트워크 내부에 위치한 다른 퍼블릭 엔트포인트를 노출시킴으로써 여러분의 워크로드를 인터넷을 통해 접근가능하도록 준다. 이를 위해 인터넷에 연결되어있는 부하분산장치 이용하거나 아니면 단순하게 VM NIC ipconfig 오브젝트에 퍼블릭 IP 할당함으로써 목적을 달성할 있다이를통해 인터넷상의 모든 것이 해당 가상 컴퓨터에 도달 가능해지며 호스트의 방화벽, 네트워크 보안 그룹(NSG) 사용자 정의 경로 통해 해당 가상 컴퓨터에 연결할 있다. 결론적으로 옵션을 이용해 인터넷을 통한 애플리케이션 공개가 가능하다.

사이트 연결 VPN 혹은 사이트 연결 VPN
  둘은 같은 범주에 속한다. VNet VPN 게이트웨이로 워크스테이션에서 직접 VPN 클라이언트를 이용해 사이트로 연결하거나 온프레미스 VPN 디바이스 Site-to-Site VPN 종말장치 기능을 이용해 연결하며, 이를통해 온프레미스 장치들이 VNet 내부의 자원들로 접근 가능해진다. 아래에서 클라우드 내부에서의 연결에 대해 다시 다룰 것이다.

ExpressRoute
  연결은 ExressRoute 기술 개요 자세히 설명되어 있다. 사이트 VPN 옵션과 마찬가지로 ExpressRoute 사용하면 하나 이상의 VNet 퍼져 있을 있는 리소스에도 연결할 있다. SKU 따라 하나 이상 이하의 VNet 연결을 허용하며 프리미엄 애드온 이용시 대역폭에 따라 최대 100 까지 연결 가능하다. 내용 또한 아래의 클라우드 내부 연결 옵션에 다시 설명하겠다.

Background


 클라우드 내부의 네트워킹에 대해 자세히 알아보기 전에VNet 개념 VNet 이상으로 구성하는 이유에 대해 이해가 필요하다
 VNet 개념을 설명한 문서 따르면, 이는 '사용자의 니즈에 맞게 Azure 내에 만들어진 고립된 네트워크' 요약할 있다예를 들어, 가상 머신을 프레미스에서 Azure 이동하기 시작한다면 작업이 필요할 것이다. 당신이 IP 주소 공간을 선택하므로 클라우드로 이전하기 전에 IP 주소 할당을 계획하는 것이 중요하다. Azure 당신 회사의 데이터센터를 확장한다면 당신은 IP CIDR 블록 혹은 클래스리스 도메인 라우팅 등에 대해서 고려해야 것이다.
 이제 VNet 무엇인지 조금 이해했다. 그럼 여러개의 VNets 도움이 되는 것일까? 기업은 서로 분리해두어야 필요가 있는 여러 비즈니스 라인을 보유하고 있는 경우가 있기 때문이다. 이것은 다른 비즈니스 단위로 인보이스를 발행하거나 서로 다른 가상 네트워크 관련 요소들 (네트워크 보안 그룹, 사용자정의 경로 ) 각각 관리해야 하는 이슈 등이 관련되어 있다.

클라우드 내부 연결 옵션
 비즈니스 라인들 간의 데이터 교환 혹은 가상 네트워크 IP 연결 시에 Azure 3 가지 네이티브 옵션을 제공한다.
방법들이 갖는 기능과 효과를 비교해 보자.


VPN 통한 VNet-to-VNet

 VPN 통해 2 개의 VNets 서로 연결되어 있는 경우 가상 네트워크의 라우팅 테이블은 다음 그림과 같다.
 2 개의 VNet 만으로도 흥미롭지만, 스케일을 키워보자.


 VNet4 VNet5 라우트 테이블은 VNet3 도달하는 경로를 나타낸다. 하지만 VNet4 VNet5 접근할 없는데, 이를 해결할 가지 방법이 있다.
  가지 방법을 사용하면 3 개의 VNet 모두가 서로에게 접근할 있다. 당연히 이는 많은 수의 VNet 구성하는 경우에도 확장가능하다.


ExpressRoute 통한 VNet-to-VNet

 하나 이상의 VNet 동일한 ExpressRoute 서킷에 연결 재미있는 부작용을 초래한다. 예를 들어 동일한 ExpressRoute 서킷에 연결된 2 개의 VNets 있는 경우의 라우팅 테이블은 다음과 같다.


 흥미롭게도 VNets MSEE (Microsoft Enterprise Edge) 라우터를 벗어나지 않고 서로 통신할 있는데, 이는 서로간의 통신을 위해 Microsoft 백본 떠날 필요가 없다는 것을 의미한다. 이것이 중요한가. 이는 VNets 통신시 추가적인 요금부과가 없도록 준다. 요컨대, ExpressRoute Premium 서킷 사용할 경우 동일한 지역 또는 글로벌 범위에서 VNets간에 통신하는 것이 가능하다. , 전세계의 Microsoft 백본을 사용하여 여러 VNets 함께 연결할 있으며, 이렇게 동일한 ExpressRoute 서킷에 연결된 VNet-to-VNet 트래픽은 요금이 부과되지 않는다. 아래 그림은 동일한 ExpressRoute 서킷에 연결된 3개의 VNet 보여준다


 위의 그림에서 VNet 서브넷의 Effective Route Table 나타나는 여러 경로를 있다.


가상 네트워크 피어링을 이용한 VNet-to-VNet

 복수 VNet 연결을 위한 마지막 선택지는 단일 Azure 리전 내에서 사용 가능한 가상 네트워크 피어링이다. 2 개의 VNet 피어링 배열은 VNet 본질적으로 1 개의 가상 네트워크 것처럼 작동하지만 NSG 라우트 테이블을 사용하여 통신을 제어 있다


 이를 허브와 스포크 형태의 토폴로지로 표현하면 다음과 같다.


 피어링은 VNet 넘어 전파되지 않으므로 HR VNet Marketing VNet 직접 대화 없지만 HR, 마케팅 엔지니어링의 VNet 모두 도메인 컨트롤러, 모니터링 시스템, 방화벽 또는 기타 Network Virtual Appliance (NVA) 등과 같은 공유 리소스를 포함하는 허브 VNet 대화 있다
 그러나 VPN 경우와 같이 VNet 서로 통신 있어야 한다면 다음과 같은 토폴로지를 참고할 있다.  명확한 이해를 위해 완전히 메쉬되지 않은 형태의 토폴로지를 준비했다. ( 경우 HR VNet Engineering VNet 직접 대화 없다). 이것으로부터 아이디어를 얻을 있을 것이다.


 VNet 피어링을 사용할 공유 가능할 있는 중요한 리소스 하나는 게이트웨이(VPN ExpressRoute 모두)이다

  방식을 이용해 각각의 스포크 VNet ExpressRoute 또는 VPN 게이트웨이를 배포하지 않고도 허브 VNet으로 보안 스탬프 게이트웨이 액세스를 중앙 집중화 있다.

옵션 종합 정리

 이러한 여러 방법과 옵션들은 개별적으로 충분히 흥미롭지만 함께 결합되어 강력한 기능을 제공한다.

게이트웨이 공유를 이용한 VNet 전파

 아래의 토폴로지는 간단한 허브 스포크 토폴로지를 보여준다. VNet 피어링 자체에서 전파가 불가능하더라도 게이트웨이(VPN ExpressRoute) 통해 중계 라우팅이 가능하다. VNet 피어링과 게이트웨이 공유를 사용하며 Express Route 사용하는 예는 다음과 같다.

게이트웨이 공유를 이용한 VNet 전파, 2 리전의 1  ExpressRoute 서킷

 하나 이상의 Azure 리전(VNet 피어링은 단일 리전에 만들어진다.) 결합하기 위해서는 다음과 같은 토폴로지를 사용할 있다

 위의 이미지에서 서부 미국 동부 미국 모든 VNet SKU 따라 1, 2, 혹은 10Gbps 속도로 Microsoft 백본 네트워크 내에서 서로 통신한다. 미국 동부 리전을 향하는 패킷은 미국 서부 리전과 시카고 사이에서 물리적으로 라우팅 된다는 점을 주목하자. 이는 시카고가 리전 사이에 위치하기 때문이다.

게이트웨이 공유를 통한 VNet 전파, 2 리전의 2 ExpressRoute 서킷

 시카고보다 ExpressRoute 대한 연결이 필요한 곳인 경우 혹은 단일 ExpressRoute로는 탄력성이 부족할 경우 다음과 같은 토폴로지를 만들 있다.

 프레미스들이 미국 서부 동부에 위치할 경우 프레미스 연결이 나은 지연 시간을 가질 있다. 또한, 동서부 각각에 위치한 VNet 간에 패킷이 전달될 있는 2 개의 ExpressRoute 있다. 이러한 리전들은 서킷 위치와 가깝기 때문에 조금의 레이턴시가 추가되어도 문제가 되지 않는다. 게다가 이러한 구조는 별개의 위치에서 별개의 ExpressRoute 회로를 사용하기 때문에 높은 가용성을 보장한다.

게이트웨이 공유를 통한 VNet 전파, 3 리전의 3 ExpressRoute 서킷

  모델은 많은 서킷과 많은 리전으로 확장 수도 있으며 Azure Networking 툴박스를 사용하여 만들 있는 토폴로지에 대한 이해를 돕기에도 적절하다.

 최적의 라우팅을 위해서는 로컬 서킷이 중요하다. 이에 대해 ExpressRoute 라우팅 최적화 관련된 글을 참고하는 것이 좋다. 글에서는 서부에서 출발해 북유럽을 향하는 패킷이 도쿄의 ExpressRoute 서킷을 통과하지 않도록 설정하는  가상네트워크 최적의 라우팅 설정에 대해 서술하고 있다. 연결에 대해 가중치를 부여함으로써 이러한 목적달성이 가능하다.

BGP 활성화된 VPN 게이트웨이의 공유와 VPN 전파 라우팅을 통한 VNet 전파

 아래의 토폴로지는 BGP 라우팅을 사용하는 VPN 전송의 다른 재미있는 사례를 보여준다. 자세한 내용은 Azure VPN 게이트웨이 BGP 개요에서 확인 가능하다.

  그림에서는 프록시와 같은 매커니즘 없이 Azure 백본을 효과적으로 사용함으로써 개의 시설을 연결하고 있는데 서부 온프레미스 환경에 위치한 사용자가 VPN 통해 북유럽 VNet 연결된 VPN 사용자에 접근할 있도록 작동한다.











번역된 컨텐츠입니다.

Microsoft Azure. by Olivier Martin, Global Black Belt - Azure Networking. https://azure.microsoft.com/en-us/blog/networking-to-and-within-the-azure-cloud/, https://azure.microsoft.com/en-us/blog/networking-to-and-within-the-azure-cloud-part-2/, https://azure.microsoft.com/en-us/blog/networking-to-and-within-the-azure-cloud-part-3/

Translated article.

Microsoft Azure. by Olivier Martin, Global Black Belt - Azure Networking. https://azure.microsoft.com/en-us/blog/networking-to-and-within-the-azure-cloud/, https://azure.microsoft.com/en-us/blog/networking-to-and-within-the-azure-cloud-part-2/, https://azure.microsoft.com/en-us/blog/networking-to-and-within-the-azure-cloud-part

Thursday, April 27, 2017

리눅스 Audit 시스템 소개


Linux Audit System



리눅스 Audit 시스템은 해당 시스템의 보안관련 정보를 추적할 수 있도록 도와준다. 사전 설정된 규칙에 따라 Audit은 시스템에서 발생된 이벤트에 관해 많은 정보를 포함하는 로그를 생성하며 이러한 정보는 미션 크리티컬한 환경에서 보안 정책과 그들이 수행한 작업의 위반자를 파악하는데 결정적 역할을 할 수 있다. Audit은 추가적인 보안을 시스템에 제공하지 않지만 시스템에 적용된 보안정책의 위반을 파악하는데 이용되며 SELinux와 같은 추가적인 보안 수단과 조합해 사용한다면 위험을 예방하는 데에 많은 도움이 된다.


Audit이 자신의 로그로써 기록 가능한 요소들은 다음과 같다.
  • 날짜와 시간, 유형 및 이벤트의 결과
  • 주체와 객체의 민감도 레이블
  • 일련의 이벤트를 발생시킨 사용자 ID
  • Audit의 모든 수정사항과 Audit 로그파일 접근시도
  • SSH나 Kerberos 등의 모든 인증메커니즘 이용기록
  • /etc/passwd와 같은 데이터베이스의 수정사항
  • 시스템으로 파일을 가져오거나 시스템에서 파일을 가져가려는 행위
  • 사용자 ID, 주체와 객체 레빌 및 기타속성을 기반으로 이벤트를 포함하거나 배제


Audit System의 사용은 수많은 보안관련 자격에 요건이 된다. Audit은 다음과 같은 자격 혹은 규정들의 요건 이상을 만족하기 위해 디자인 되었다.
  • Controlled Access Protection Profile (CAPP)
  • Labeled Security Protection Profile (LSPP)
  • Rule Set Base Access Control (RSBAC)
  • National Industrial Security Program Operating Manual (NISPOM)
  • Federal Information Security Management Act (FISMA)
  • Payment Card Industry — Data Security Standard (PCI-DSS)
  • Security Technical Implementation Guides (STIG)
또한 다음 내용이 해당한다.
  • Evaluated by National Information Assurance Partnership (NIAP) and Best Security Industries (BSI).
  • Certified to LSPP/CAPP/RSBAC/EAL4+ on Red Hat Enterprise Linux 5.
  • Certified to Operating System Protection Profile / Evaluation Assurance Level 4+ (OSPP/EAL4+) on Red Hat Enterprise Linux 6.


용례


파일 액세스 감시


Audit은 파일이나 디렉토리가 액세스, 수정, 실행되거나 또는 파일의 속성이 변경되었는지 추적 할 수 있다. 예를들어 이것을 통해 중요 파일에 대한 액세스를 감지하고 이러한 파일 중 하나가 손상되는 경우에 Audit 추적을 할 수 있다.


시스템 호출 모니터링


Audit는 특정 시스템 콜을 사용할 때마다 로그를 기록할 수 있다. 예를들어 이를통해 settimeofday, clock_adjtime 혹은 기타 시간 관련 시스템 콜을 모니터링하여 시스템 시간 변경을 추적하는데 응용될 수있다.


사용자가 실행한 명령 기록


Audit은 파일이 실행되었는지 여부를 추적 할 수 있기 때문에, 특정 명령의 모든 실행을 기록하도록 규칙을 정의할 수 있다. 예를 들어, bin 디렉토리의 모든 실행파일에 대해 감사를 정의함으로써 각 사용자별로 실행한 명령을 로그로 추적할 수 있다.


보안 이벤트 기록


pam_faillock 인증 모듈은 실패한 로그인 시도를 기록 할 수 있다. Audit 또한 실패한 로그인 시도를 기록하도록 설정될 수 있음은 물론 로그인을 시도한 사용자에 대한 추가 정보도 제공 할 수 있습니다.


이벤트 검색


Audit은 ausearch 유틸리티를 통해 로그 조건들을 필터링하고 여러 조건들에 기초한 완전한 감사추적을 제공할 수 있다.


요약 보고서


aureport 유틸리티는 이벤트 기록을 토대로 한 일일 보고서 중 생성하는데 사용된다. 시스템 관리자는 이 보고서를 분석하여 의심스러운 활동을 더 깊이 조사 할 수 있다.


네트워크 액세스 모니터링


시스템 관리자는 네트워크 액세스를 모니터링 할 수 있도록 iptables 및 ebtables 유틸리티는 Audit 이벤트를 트리거하도록 구성될 수 있다.


<Audit System 아키텍처>


감사 시스템은 크게 두 가지 부분, 사용자 공간 애플리케이션과 유틸리티 부분,  커널 측 시스템 호출 처리 부분으로 구분된다.  커널 컴포넌트는 사용자 공간 프로그램에서 시스템 호출을 수신하고 그것들을 user, task, exit로 이뤄진 3 개의 필터 중 하나를 통해 필터링한다.
시스템 호출이 필터를 통과 한 후에는 exclude 필터로 보내진 후, Audit 규칙에 기초해 추가적인 프로세스를 위해 Audit 데몬으로 전달된다. 그림 1.1 "Audit 시스템 아키텍처"는 이 과정을 보여준다.
Audit system architecture
그림 1.1. Audit 시스템 아키텍처 ( 출처 : 레드햇 도큐먼트 )


사용자 공간 Audit 데몬은 커널에서 정보를 수집하고 로그 파일에 해당 항목을 생성한다. 기타 Audit 사용자 공간 유틸리티는 Audit 데몬, 커널 Audit  구성 요소 또는 감사 로그 파일과 상호 작용한다 :


audisp : Audit 디스패처 데몬은 Audit 데몬과 상호 작용하고 추가 처리를 위해 다른 응용 프로그램에 이벤트를 전송한다. 이 데몬의 목적은 Audit 이벤트와 실시간 분석 프로그램이 상호 작용할 수 있도록 플러그 장치를 제공하는 것이다.


auditctl : Audit 제어 유틸리티는  이벤트 발생 프로세스의 수많은 설정과 파라미터들을 컨트롤하기 위해 커널의 Audit 구성요소와 상호작용한다.


나머지 Audit 유틸리티는 Audit 로그파일 내용을 이용해 유저의 요구에 따른 출력을 생성한다. 예를 들어, aureport 유틸리티는 기록 된 모든 이벤트의 보고서를 생성한다.


<Audit 패키지 설치>


Audit 시스템 사용을 위해, Audit 패키지(audit, audit-libs)가 필요하며 RHEL계열의 경우 디폴트로 설치되어 있다.
만약 설치가 필요할 경우 다음 명령을 실행한다.


~]# yum install audit


<Audit 설정>


Audit 데몬은 /etc/audit/auditd.conf 파일로 설정 가능하다. 이 파일은 Audit 데몬의 행동을 설정하는 파라미터들로 이루어져 있다. 비어있는 줄이나 해쉬(#) 뒤의 텍스트는 무시된다. 전체 설정 파라미터와 설명은 audit.conf(5) 매뉴얼 페이지에 서술되어 있다.


-CAPP 환경 하에서의 auditd 설정
auditd의 디폴트 설정은 대부분의 환경에 적합하다. 하지만 CAPP 기준에 맞추어야 하는 환경이라면, Audit 데몬을 다음과 같이 설정해야 한다.


> Audit 로그가 저장경로(보통 /var/log/audit/)는 다른 파티션에 있어야 한다. 이것은 다른 프로세스가 이 공간을 점유하는 것을 예방해 Audit 데몬이 남은 공간을 정확하게 파악하게 해 준다.  


> 개별 Audit 로그 파일의 최대크기를 정의하는 max_log_file 파라미터는 Audit로그파일을 저장하는 파티션의 가용한 모든 공간을 사용하도록 설정해야 한다.


> max_log_file에서 정의된 제한에 도달했을 경우에 취할 행동이 정의된 max_log_file_action 파라미터는 keep_logs로 설정하여 덮어쓰기를 방지해야 한다.


> 디스크의 남은 용량을 명시하는  space_left 파라미터는, space_left_action 파라미터가 미리 설정된 action을 취하기 전, 시스템 관리자가 충분한 시간을 갖고 대응 및 디스크 비우기를 할 수 있도록 설정되어야 한다. space_left 값은 Audit 로그 파일이 생성되는 주기에 따라 알맞게 설정한다.


> 적시에 문제상황이 관리자에게 전파될 수 있도록 speace_left_action 파라미터에 email이나 exec 을 통한 알림설정을 권한다.


> admin_space_left_action 파라미터에 정의된 내용이 실행되기 위한 디스크 잔여공간의 절대 최소값을 정의한 admin_space_left 파라미터는 관리자가 로그에 대응했을 경우에 남게 되는 로그가 남을 수 있도록 충분한 공간이 확보되게 설정해야 한다.


> admin_space_left파라미터는 관리자가 시스템을 single-user-mode로 진입하여 디스크를 비우는 등의 동작을 보장할 수 있도록 single로 설정되어야 한다.


> Audit로그 파일을 보관하고 있는 파티션의 잔여 용량이 없을때의 행동을 정의한 disk_full_action 파라미터는 halt나 single로 설정되어야 한다. 이것은 Audit이 더 이상 로그를 기록할 수 없을 때 시스템이 셧다운되거나 single-user-mode가 되도록 한다.


> 로그 파일이 보관된 파티션의 에러를 발견했을때의 행동을 정의한 disk_error_action 파라미터는 하드웨어 오작동에 관련한 로컬 보안 정책에 기초해 syslog, single 혹은 halt로 설정되어야 한다.


> flush 설정 파라미터는 sync나 data로 설정되어야 한다. 이 파라미터는 모든 Audit 로그가 디스크의 로그파일들과 온전하게 동기화되도록 보장한다.


기타 설정 옵션은 해당 로컬 보안 정책에 맞게 세팅한다.


<Audit 서비스 실행>


auditd가 적절하게 설정되면 Audit 정보를 수집하고 로그로 남길 수 있도록 서비스를 실행한다. auditd를 실행하기 위해 root 권한으로 다음 명령을 실행한다.


~]# service auditd start


*auditd를 다룰때에는 service 커맨드를 사용해야한다. auditd를 다룸에 있어 systemctl커맨드를 사용할 수 있는 경우는 enable과 status 뿐이다.


다음 명령으로 부팅시에 자동실행되도록 할 수 있다.


~]# chkconfig auditd on


혹은 systemd를 사용할 수 있다.


~]# systemctl enable auditd


service auditd <action> 커맨드를 이용해 많은 것을 할 수 있다. 몇 가지 예를 들면 다음과 같다.


stop : auditd 정지


restart : auditd 재시작


reload 혹은 force-reload : auditd의 설정을 /etc/audit/auditd.conf 에서 다시 불러온다/


rotate : /var/log/audit/ 디렉터리의 로그 파일을 로테이트 한다.


resume : Audit 로깅을 속행하는데, 이는 로그가 기록되는 파티션 공간이 부족해 서스펜드 되어 있던 Audit 로깅을 다시 진행시키는 등의 목적으로 사용될 수 있다.  


condrestart 혹은 try-restart : 이미 실행중인 auditd의 재시작을 위한 명령어.


status : auditd의 실행상황을 보여준다.


<Audit 규칙 설정>


Audit 시스템은 로그 파일로 캡쳐될 요소를 정의한  일련의 규칙에 따라 작동한다. 다음은 세 가지 Audit 규칙 타입이다.


> 제어 규칙 : Audit 시스템의 행동과 일부 설정을 수정한다.


> 파일시스템 규칙 : 파일 감시자라고도 알려져 있으며, 특정 파일이나 디렉터리로의 접근을 감사한다.


> 시스템 호출 규칙 : 특정 프로그램이 발생시키는 시스템 호출을 기록한다.


Audit 규칙은 커맨드라인에서 auditctl 유틸리티를 통해 제어하거나(이는 재부팅시 초기화된다), /etc/audit/audit.rules 파일을 수정함으로써 적용가능하다.


-auditctl 유틸리티를 이용한 Audit 규칙 정의


Audit 서비스와 Audit 로그 파일과 관련된 모든 상호작용은 root 권한을 필요로 한다.


auditctl 커맨드를 이용해 audit 시스템의 기본적인 기능을 제어할 수 있고 어떠한 Audit 이벤트를 로깅할 지에 대한 규칙을 정의할 수 있다.


> 제어 규칙 정의하기


다음은 Audit 시스템의 작동을 수정하는 몇 가지 제어규칙들이다


-b : 커널에 존재하는 Audit 버퍼의 최대량을 정한다.
ex)
~]# auditctl -b 8192


-f : 치명적 에러를 탐지했을 때의 동작을 설정한다.  
ex)
~]# auditctl -f 2
위 설정에 따르면 치명적 에러 발생 시 커널패닉을 트리거 한다.


-e : Audit 시스템을 가동/중지하거나 설정을 잠근다.
ex)
~]# auditctl -e 2
위 명령어로 Audit  설정을 잠근다.


-r : 초당 발생하는 메시지의 숫자를 설정한다.
ex)
~]# auditctl -r 0
위 명령어로 메시지 생성 제한을 풀 수 있다.


-s : Audit 시스템의 상태를 보여준다.
ex)
~]# auditctl -s
AUDIT_STATUS: enabled=1 flag=2 pid=0 rate_limit=0 backlog_limit=8192 lost=259 backlog=0


-l : 현재 로드된 모든 Audit 규칙을 보여준다.
ex)
~]# auditctl -l
LIST_RULES: exit, always watch=/etc/localtime perm=wa key=time-change
LIST_RULES: exit, always watch=/etc/group perm=wa key=identity
LIST_RULES: exit, always watch=/etc/passwd perm=wa key=identity
LIST_RULES: exit, always watch=/etc/gshadow perm=wa key=identity


-D : 현재 로드된 모든 Audit 규칙을 삭제한다.
ex)
~]# auditctl -D
No rules


> 파일시스템 규칙 정의하기


파일 시스템 규칙을 정의하기 위해, 다음 구문을 사용한다.


auditctl -w <파일경로> -p <퍼미션> -k <키 이름>


<파일경로>는 Audit이 추적할 파일이나 디렉터리의 경로이다.


<퍼미션>은 로깅된 퍼미션이다. r,w,x,a로 구성되며 각각 읽기, 쓰기, 실행, 수정에 해당한다.


<키 이름>에 사용자가 로그를 볼 때 쉽게 구분할 수 있도록 규칙에 임의의 이름을 넣을 수 있다.


examples)


/etc/passwd 파일에 읽기 엑세스나 수정을 시도할 때 로그를 기록하게 정의할 수 있다.


~]# aditctl -w /etc/passwd -p wa -k passwd_changes


-k 옵션 뒤에 따라오는 값은 임의로 이름지어 붙일 수 있다.


/etc/selinux/ 디렉터리의 모든 파일에 대해 읽기 엑세스나 수정 시도를 기록하려면 다음과 같이 정의한다.


~]# aditctl -w /etc/selinux -p wa -k selinux_changes


리눅스 커널에 모듈을 삽입하는데 쓰이는  /sbin/insmod 커맨드 실행을 추적하기 위해서 다음과 같이 정의한다.


~]# aditctl -w /sbin/insmod -p x -k module_insertion


> 시스템호출 규칙 정의하기


시스템호출 규칙을 정의하기 위해서는 다음 구문을 사용한다.


auditctl -a <동작,필터> -S <시스템호출> -F <field=value> -k <키 이름>


<동작, 필터>는 어떤 이벤트가 로그로 기록되는 시점을 지정한다. ‘동작’은 always 나 never가 될 수 있다. ‘필터’는 어떤 커널 rule-matching이 이벤트에 적용되는지 특정한다. rule-matching filter는 task, exit, user 또는 exclude가 될 수 있다. 자세한 내용은 전술한 [Audit System 아키텍쳐] 부분을 참고한다.


<시스템호출>은 이름으로 시스템호출을 지정한다. 시스템호출의 전체 리스트는 /usr/include/asm/unistd_64.h 파일에서 찾을 수 있다. 몇 몇 시스템호출을 하나의 그룹으로 묶을 수 있으며 각각 -s 옵션 뒤에 입력해야 한다.


<field=vaule>는 시스템아키텍처, 그룹ID, 프로세스ID 등을 이용해 더욱 세세한 규칙을 정할 수 있게 한다. 사용가능한 전체 field type과 value은 auditctl(8) 매뉴얼 페이지에서 확인할 수 있다.


<키 이름>을 입력함으로써 규칙 구분을 위한 이름을 임의로 지을 수 있다.  


examples)


64비트 아키텍처 머신에서, 프로그램에 의해 adjtimex 또는 settimeofday 시스템 호출이 이뤄질 때마다 Audit이 로그를 기록하도록 하려면 다음과 같이 규칙을 정의한다.


~]# auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change


유저 ID 번호 500 이상(그리고 UID를 부여받지 않은 사람을 제외하기 위해 -F auid!=4294967295 옵션을 이용한다.)을 가진 사용자가 파일 삭제 혹은 파일이름 수정을 하는 것을 Audit에서 기록하려면 다음을 입력한다.


~]# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete


시스템호출 규칙 구문을 이용해 파일시스템 규칙을 정의하는 것도 가능하다. 파일시스템 규칙에서 -w /etc/shadow -p wa 와 같이 정의되는 구문을 시스템호출 규칙 구문으로 다음과 같이 표현한다.


~]# auditctl -a always,exit -F path=/etc/shadow -F perm=wa

-영구적인 Audit 규칙 정의와 /etc/audit/audit.rules 파일 조작
Audit 규칙을 재부팅 후에도 지속되게 하려면 /etc/audit/audit.rules 파일에 해당 내용을 포함시켜야 한다. 이 파일은 규칙을 정의하는데 auditctl 명령어와 동일한 구문을 사용하며 빈 줄이나 해쉬(#)처리된 부분은 무시된다.


auditctl 명령에 -R 옵션을 사용하면, 특정한 파일에서 규칙을 읽어내는 것도 가능하다.
~]# auditctl -R /usr/share/doc/audit-<버전>/stig.rules


> 제어 규칙 정의하기


파일은 Audit 시스템의 행동을 수정하는 다음과 같은 몇가지 제어 규칙들을 포함할 수 있다.: -b, -D, -e, -f, -r
자세한 내용은 전술한 [제어규칙 정의하기]부분을 참조한다.


examples) audit.rules에서의 제어규칙


# Delete all previous rules
-D


#Set buffer size
-b 8192


# Make the configuration immutable -- reboot is required to change audit rules
-e 2

# Panic when a failure occurs
-f 2

# Generate at most 100 audit messages per second
-r 100


> 파일시스템 정의하기와 시스템호출 규칙


파일시스템과 시스템호출 규칙은 auditctl 구문을 이용해서 정의할 수 있다. 전술한 [auditctl 유틸리티를 이용한 Audit 규칙 정의]에 제시된 예는 다음과 같이 파일에 적용한다.


examples) audit.rules에서의 파일시스템과 시스템호출 규칙


-w /etc/passwd -p wa -k passwd_changes
-w /etc/selinux/ -p wa -k selinux_changes
-w /sbin/insmod -p x -k module_insertion

-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
-a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=500 -F auid!=4294967295 -k delete


> 사전정의된 규칙 파일


/usr/share/doc/audit-<버전>/ 디렉토리 안에는 여러 보안인증표준에 맞춰 audit 패키지에서 준비한 사전정의된 규칙 파일들이 포함되어 있다.


nispom.rules : National Industrial Security Program Operating Manual의 8장에서 상술된 조건을 충족할 수 있도록 구성된 Audit 규칙 설정.


capp.rules : Controlled Access Protection Profile (CAPP) 에서 요구하는 조건을 충족할 수 있도록 구성된 Audit 규칙 설정.
lspp.rules : Labeled Security Protection Profile (LSPP) 에서 요구하는 조건을 충족할 수 있도록 구성된 Audit 규칙 설정.


stig.rules : Security Technical Implementation Guides (STIG) 에서 요구하는 조건을 충족할 수 있도록 구성된 Audit 규칙 설정.


이 설정 파일들을 이용하기 위해서는 기존 사용하던 /etc/audit/audit/rules 파일을 백업해둔 뒤 사전정의된 규칙 파일을 /etc/audit/rules로 복사한다.


~]# cp /etc/audit/audit.rules /etc/audit/audit.rules_backup
~]# cp /usr/share/doc/audit-version/stig.rules /etc/audit/audit.rules


<Audit 로그 파일 이해>


Audit 시스템은 디폴트로 로그를 /var/log/audit/audit.log 파일에 저장한다. 로그 로테이션이 활성화 되어 있으면 그 폴더 안에 넘버링을 해가며 계속 로그를 저장한다.


다음 Audit 규칙은 /etc/ssh/sshd_config 파일로의 모든 읽기 혹은 수정 시도를 기록한다.


-w /etc/ssh/sshd_config -p warx -k sshd_config


auditd 데몬이 실행중일 때 다음 명령을 실행하면 Audit 로그 파일에 이벤트가 기록된다.


~]# cat /etc/ssh/sshd_config


이 이벤트는 audit.log 파일 안에 다음과 같이 기록된다.


type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13 a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=500 uid=500 gid=500 euid=500 suid=500 fsuid=500 egid=500 sgid=500 fsgid=500 tty=pts0 ses=1 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sshd_config"
type=CWD msg=audit(1364481363.243:24287):  cwd="/home/shadowman"
type=PATH msg=audit(1364481363.243:24287): item=0 name="/etc/ssh/sshd_config" inode=409248 dev=fd:00 mode=0100600 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0


위의 이벤트는 각각 type=(키워드)로 시작하는 연속된 세 개의 레코드로 구성되어 있으며 이들은 같은 타임스탬프와 시리얼번호를 공유하고 있다. 각 레코드는 공백이나 콤마로 구분된 몇개의 name=value 쌍으로 구성되어 있다.   


-첫번째 레코드


type=SYSCALL
type 필드는 레코드의 타입을 정의한다. 이번 예에서는 커널에의 시스템호출에 의해 이 로그가 기록된 것을 알 수 있다.  


가능한 모든 종류의 타입과 그에 대한 설명은 “Audit 레코드 타입 목록”을 참조한다.


msg=audit(1364481363.243:24287):
msg 필드는 audit(타임스탬프:유니크ID) 형식을 취하고 있으며 같은 Audit 이벤트에 의해 생성된 레코드들의 경우 다수의 레코드가 같은 타임스탬프와 ID를 공유할 수 있다. 커널이나 사용자 공간 애플리케이션에 의해 여러가지 이벤트를 특정하는 name=value 쌍이 존재한다.


arch=c000003e
arch 필드는 시스템의 CPU 아키텍처 정보를 16진수로 보여준다. Audit 기록을 찾을 때 사용하는 ausearch 명령어에 -i 혹은 --interpret 옵션을 사용하면 이해할 수 있는 형식으로 변환해서 출력한다. 이번 예에서는 x86_64를 의미한다.


syscall=2
syscall 필드는 커널로 보내진 시스템호출 타입을 기록한다. 여기서 주어진 값 2는 /usr/include/asm/unistd_64.h 파일에서 의미를 찾아볼 수 있는데, open 시스템 호출을 의미한다. ausyscall --dump 명령어를 이용하면 모든 시스템호출 값의 리스트를 출력해 볼 수 있다. 추가 정보는 ausyscall(8) 매뉴얼 페이지를 참조한다.


success=no
success 필드를 통해 이벤트에 기록된 시스템 호출의 성공 여부를 알 수 있다. 이 경우에는 성공하지 못했다.


exit=-13
exit 필드는 시스템호출로부터 반환된 엑시트 코드 값을 보여준다. 이 값은 시스템 호출에 따라 다르며 ausearch --interpret --exit -13 명령어를 사용하면 이해할 수 있는 값으로 변환하여 보여준다.


a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a
a0부터 a3까지는 시스템호출의 첫 네 개의 argument를 16진수로 나타낸 값이다. 이는 시스템호출에 따라 차이가 있으며 ausearch 유틸리티를 통해 이해할 수 있는 값으로 변환해 출력 가능하다.


items=1
items 필드는 이 이벤트의 path 레코드의 숫자를 나타낸다.


ppid=2686
ppid는 부모 프로세스 ID이며 이 경우에는 bash 프로세스이다.


pid=3538
pid는 프로세스ID이며 이 경우 cat 프로세스이다.


auid=500
Audit User ID로 이 ID는 로그인과 물려받는 모든 프로세스에 할당되며 심지어 ID가 바뀌어도 유지된다. 예를들어 su - john 커맨드를 통해 유저를 바꾸어도 지속된다.


uid=500
사용자 아이디. ausearch -i --uid <UID> 명령을 통해 이름으로 볼 수 있다.


ses=1
이벤트가 발생한 세션 ID를 나타낸다.


comm="cat"
Audit 이벤트를 발생시킨 커맨드를 알 수 있다. 이 경우 cat이다.


exe="/bin/cat"
실행 파일의 위치를 보여준다


subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
SELinux 컨텍스트이다.


key="sshd_config"
최초 룰셋 설정 시에 사용자가 임의로 정한 키가 나온다.


-두번째 레코드


type=CWD
Current Working Directory를 의미하며, 따라오는 정보가 그에 관련한 내용임을 알려주고 있다. 이 정보는 상대적 경로정보와 합쳐지면 완전한 경로를 재구성하는 것이 가능하다


msg=audit(1364481363.243:24287):
msg 필드는 첫번째 레코드와 같은 타임스탬프와 유니크ID를 갖고 있다.


cwd="/home/shadowman"
cwd 필드는 시스템호출이 실행된 경로 정보를 보여준다.


-세번째 레코드


type=PATH
type필드 값이 PATH이다. Audit 이벤트는 시스템호출에 argument로써 커널로 전달된 모든 경로를 기록한다. 이번 경우에는 하나의 경로(/etc/ssh/sshd_config)만이 argument로 전달되었다.


msg=audit(1364481363.243:24287):
msg 필드는 첫번째, 두번째 레코드와 같은 타임스탬프와 유니크ID를 갖고 있다.


item=0
item 필드는 SYSCALL 타입의 레코드에 참조된 time 중 현재 레코드가 몇 번째인지 알려준다. 이 번호는 0부터 시작하며 이번 예의 경우, 이 레코드가 첫 번째 item임을 가리킨다.


name="/etc/ssh/sshd_config"
시스템호출에 argument로 넘겨진 파일이나 디렉터리의 완전한 경로를 나타낸다. 이 경우에는 /etc/ssh/sshd_config가 된다.  


inode=409248
이 필드는 기록된 이벤트와 관련있는 파일이나 디렉터리의 아이노드 정보를 포함한다. 다음 명령어를 통해 아이노드 번호 409248과 관련한 정보를 조회할 수 있다.


~]# find / -inum 409248 -print
/etc/ssh/sshd_config


dev=fd:00
해당 이벤트가 기록된 파일이나 디렉터리를 포함된 디바이스의 주, 부 ID를 나타낸다. 이 경우에는 /dev/fd/00 이 해당된다. (/dev/fd에 관한 추가설명)  


mode=0100600
파일이나 디렉터리의 퍼미션을 나타내며 이경우 /etc/ssh/sshd_config 파일의 퍼미션인 -r--------에 해당한다.


rdev=00:00
rdev는 특별한 경우의 파일을 위한 저장 디바이스의 인식자를 나타낸다. 이 경우 해당하지 않는다.


obj=system_u:object_r:etc_t:s0
SELinux의 컨텍스트를 보여준다.


-추가 레코드 예시


다음은 auditd 데몬의 성공적인 실행을 나타내는 Audit 로그이다. ver 필드는 실행된 Audit 데몬의 버전 정보를 보여준다.


type=DAEMON_START msg=audit(1363713609.192:5426): auditd start, ver=2.2 format=raw kernel=2.6.32-358.2.1.el6.x86_64 auid=500 pid=4979 subj=unconfined_u:system_r:auditd_t:s0 res=success


다음 레코드를 통해 유저ID 500을 가진 사용자가 root 유저로의 로그인을 시도했고, 실패 했음을 알 수 있다.


type=USER_AUTH msg=audit(1364475353.159:24270): user pid=3280 uid=500 auid=500 ses=1 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:authentication acct="root" exe="/bin/su" hostname=? addr=? terminal=pts/0 res=failed'


<Audit 로그 파일 검색>


ausearch 유틸리티는 특정 Audit 로그 검색을 할 수 있도록 한다. ausearch의 기본값은 /var/log/audit/audit.log 파일을 검색하도록 되어 있으나 ausearch <옵션> -if <파일경로 및 이름> 명령어를 사용해 특정할 수 있다. ausearch 커맨드 입력시에 포함된 다수의 옵션은 AND로 인식하며 필드 타입이 다수 입력될 시 타입간에는 OR로 인식된다.


-ausearch를 이용한 Audit 로그검색 예시


기본 Audit로그 경로(/var/log/audit/audit.log)에서 실패한 로그인 시도를 검색하기 위해서 다음 명령어를 이용한다.


~]# ausearch --message USER_LOGIN --success no --interpret


모든 계정, 그룹, 역할변경 내역을 검색하려면 다음과 같이 입력한다.


~]# ausearch -m ADD_USER -m DEL_USER -m ADD_GROUP -m USER_CHAUTHTOK -m DEL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i


특정 사용자에 대해 Audit이 기록한 모든 로그를 보기 위해서, 사용자의 로그인ID(auid)를 이용해서 검색한다.


~]# ausearch -ua 1000 -i


어제부터 현재까지의 모든 실패한 시스템 호출을 검색할 수도 있다.


~]# ausearch --start yesterday --end now -m SYSCALL -sv no -i


ausearch에서 사용가능한 모든 옵션은 ausearch(8) 매뉴얼 페이지에서 확인 가능하다.


<Audit 보고서 작성>


aureport 유틸리티는 Audit 로그 파일에 기록된 자료를 기초로 정제된 보고서를 보여준다. 보고서 작성을 위해 기본값으로 /var/log/audit/audit.log 파일의 내용을 참조하며 aureport <옵션> -if <파일 경로 및 이름> 명령으로 특정가능하다.


-aureport를 이용한 Audit 보고서 작성 예시


예를들어 특정 3일간의 Audit로그 보고서를 생성하기 위해서 다음 명령어를 사용할 수 있다.


~]# aureport --start 11/08/2016 00:00:00 --end 11/11/2016 00:00:00


모든 실행파일 이벤트에 대한 보고서를 생성하는 명령어는 다음과 같다.


~]# aureport -x


위 보고서의 요약본을 출력하려면 --summary 옵션을 추가한다.


~]# aureport -x --summary


모든 사용자로부터 발생한 실패 이벤트 로그들의 요약보고서를 생성하기 위해 다음 명령어를 사용한다.


~]# aureport -u --failed --summary -i


각 사용자의 모든 실패한 로그인 시도에 대해 요약보고서를 생성한다.


~]# aureport --login --summary -i


ausearch 유틸리티도 질의해 얻은 결과에 파이프라인을 이용해 aureport로 프로세싱하는 것도 가능하다. 예를들어 ID 1000인 사용자의 모든 파일 엑세스에 대한 보고서는 다음과 같이 생성한다.   


~]# ausearch --start today --loginuid 1000 --raw | aureport -f --summary


보고서에 이벤트 발생 시각을 포함하여면 -t 옵션을 사용한다.


~]# aureport -t


aureport에 관련한 모든 옵션을 보려면 aureport(8) 매뉴얼 페이지를 참조한다.


<부가 자료>


-리눅스 Audit 문서화 프로젝트:


-로컬 시스템에서 참조 가능한 디렉터리:
/usr/share/doc/audit/


-관련 매뉴얼

References:
(1) Steve Grubb. Investigating Kernel Return Codes with the Linux Audit System. HITB magazine. Volume 1 Issue 5 (Feb 2011): 4-13
(2) Red Hat, Inc. Product Documentation for Red Hat Enterprise Linux. https://access.redhat.com/documentation/en/red-hat-enterprise-linux/?version=7/ (Accessed 2016-11-04).
(3) Paul Moore. SPEC Writing Good Events. https://github.com/linux-audit/audit-documentation/wiki/SPEC-Writing-Good-Events (Accessed 2016-11-04).


(4) civilfritz. 2016.Tracking user actions with the Linux Audit Subsystem. http://civilfritz.net/ Tech blog. 25 March. http://civilfritz.net/journal/tracking-user-actions-with-the-linux-audit-subsystem/ (Accessed 2016-11-04).
(5) Steve Grubb. Red Hat Summit 2011, Native Host Intrusion Detection with RHEL6 and the Audit Subsystem. https://people.redhat.com/sgrubb/audit/audit_ids_2011.pdf. 2011