
Ubuntu 14.04에서 Nginx용 AppArmor 프로필을 만드는 방법
소개
우수한 서버 관리자는 새로운 빈틈을 발견할 수 있다.대중에게 개방된 서버를 실행할 때, 보안에 관심을 가져야 한다.
불행하게도 응용 프로그램과 운영 체제에 최신 보안 패치를 업데이트해도 서버는 제로 데이 공격을 받기 쉽다. 패치가 없는 알 수 없는 빈틈에 대한 공격이다.AppArmor는 Linux 커널 모듈로 액세스 제어 시스템을 충당하여 서버가 이런 공격을 받지 않도록 보호합니다.이 모듈은 Ubuntu 8.04 출시 이후 Ubuntu에서 기본적으로 사용할 수 있습니다.
응용 프로그램의 AppArmor가 활성 상태일 때 운영 체제에서는 응용 프로그램이 보안 프로필에 언급된 파일과 폴더에만 액세스할 수 있습니다.따라서 프로그램이 공격 과정에서 파괴되더라도 정성스럽게 계획된 보안 프로필을 사용하면 큰 해를 끼치지 않는다.
본 강좌에 소개된 내용
이 강좌에서는 Nginx(유행되는 HTTP 서버) 권한에 대한 상세한 정보를 포함하는 간단한 AppArmor 보안 개요 파일을 만들 것입니다.
AppArmor의 작업 원리를 설명하기 위해서, 우리는 두 디렉터리의 정적 파일인/data/www/safe와/data/www/safe를 서비스하기 위해 Nginx를 설정하고, AppArmor를/data/www/safe로 제한합니다.
이 설정을 사용하면 AppArmor가 비활성 상태일 때 외부 사용자가 두 디렉토리의 파일에 액세스할 수 있습니다.AppArmor가 활성화되면 사용자는/data/www/safe의 파일에만 액세스할 수 있습니다.
선결 조건
다음이 필요합니다.
1단계 - Nginx 설치
apt get을 사용하여 서버를 업데이트하고 Nginx를 설치하려면:
sudo apt-get update
sudo apt-get install nginx
이제 Nginx 서버를 실행할 수 있습니다.기본 서버는 포트 80에서 실행됩니다.Droplet의 IP 주소를 액세스하여 브라우저에서 테스트할 수 있습니다. URL은 http://<서버 IP>:80입니다.기본 Nginx 시작 페이지를 보십시오.
2단계: 정적 파일을 제공하기 위해 Nginx 구성
정적 파일을 제공할 디렉터리를 만듭니다.
sudo mkdir -p /data/www/safe
sudo mkdir -p /data/www/unsafe
nano를 사용하여 보안 디렉토리에 파일을 추가합니다.sudo nano /data/www/safe/index.html
파일에 다음을 포함시킵니다.<html>
<b>Hello! Accessing this file is allowed.</b>
</html>
마찬가지로/data/www/unsafe 이름 인덱스에서 다른 파일을 만듭니다.html, 다음을 포함합니다.<html>
<b>Hello! Accessing this file is NOT allowed.</b>
</html>
Nginx의 구성 파일은/etc/Nginx/Nginx에 있습니다.conf. 이 파일을 편집하여 새 서버를 만듭니다. 이 서버는 포트 8080을 탐색하고/데이터/www에서 온 파일을 제공합니다. 편집한 후 주석 줄을 무시합니다. 파일은 다음과 같습니다.해시 표시를 추가해서 줄을 설명해야 합니다.다음 빨간색으로 표시된 전체 서버 블록을 추가해야 합니다.user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
server {
listen 8080;
location / {
root /data/www;
}
}
}
다음 명령을 실행하여 변경 사항을 저장하고 새 구성을 로드합니다.sudo nginx -s reload
현재 Nginx에 AppArmor를 열지 않았기 때문에 http://< 서버 IP>:8080/safe/index에 접근할 수 있어야 합니다.html 및 http://<서버 IP>:8080/안전하지 않음/인덱스.html.보안 페이지는 다음과 같습니다.
Nginx 구성이 완료되었습니다.
3단계 - 기존 AppArmor 구성 파일 확인
Ubuntu 14.04에는 AppArmor 구성 파일이 미리 설치되어 있습니다.이 명령을 사용하여 추가 구성 요소를 설치합니다.
sudo apt-get install apparmor-profiles
다음 명령을 실행하여 사용 가능한 모든 구성 파일을 나열합니다.sudo apparmor_status
많은 프로필을 보실 수 있을 겁니다.어떤 것은 강제 모델에 처하고, 어떤 것은 고소 모델에 처할 것이다.응용 프로그램의 프로필이 고소 모드에 있을 때, AppArmor는 응용 프로그램의 활동을 기록하며, 어떠한 방식으로도 제한하지 않습니다.기록해야 할 내용이 있으면/var/log/Nginx 디렉터리에서 Nginx 서버의 로그 파일을 찾을 수 있습니다.
AppArmor 제한 프로그램은 구성 파일이 강제 모드일 때만 수행할 수 있는 작업을 제한합니다.
Nginx 서버에 구성 파일이 없습니다.우리는 다음 단계에서 하나를 만들 것이다.
4단계 - Nginx의 새 AppArmor 구성 파일 만들기
장치를 설치하다.이것은 AppArmor를 관리하는 데 도움이 되는 유틸리티 컬렉션입니다.
sudo apt-get install apparmor-utils
이제 Nginx의 활동을 분석하기 시작할 수 있습니다.aaautodep 명령을 사용하여 새 공백 프로필을 만듭니다.프로필은/etc/apparmor에서 생성됩니다.dcd /etc/apparmor.d/
sudo aa-autodep nginx
프로필을 만든 후,aa고소를 사용하여 프로필을 고소 모드로 설정합니다.sudo aa-complain nginx
Nginx를 다시 시작합니다.sudo service nginx restart
브라우저를 열고 http://< 서버 IP>: 8080/safe/index에 액세스합니다.html.보안 웹 사이트에 액세스하는 일반적인 항목이 Nginx 로그에 표시됩니다.터미널로 돌아가다.이제 AppArmor 유틸리티를 사용하여 Nginx 로그를 확인하고 검색된 모든 작업을 승인하거나 승인하지 않습니다.
sudo aa-logprof
이 명령은 로그 파일을 검색하고 AppArmor Nginx 구성 파일을 업데이트합니다.기능을 허용하거나 거부하라는 메시지가 여러 번 표시됩니다.서버가 현재 공격을 받지 않았다고 가정하면 모든 요청 기능이 Nginx가 정상적으로 작동하는 데 필요하기 때문에 매번 A를 눌러도 됩니다.마지막으로 변경 사항을 저장하라는 메시지가 나타나면 S를 누릅니다.새 응용 프로그램에 AppArmor를 활성화하는 일반적인 절차는 다음과 같습니다.
단계 5: AppArmor Nginx 구성 파일 편집
특히 Nginx는 자동으로 생성된 파일을 정상적으로 작동하도록 변경해야 합니다.편집할 파일을 엽니다.
sudo nano /etc/apparmor.d/usr.sbin.nginx
다음 이상의 변경 사항을 수행해야 합니다.include /etc/nginx/sites-enabled/*;
-네, 해시 표기는 고의적작업 구성 파일은 다음과 같습니다.
#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/apache2-common>
#include <abstractions/base>
#include <abstractions/nis>
capability dac_override,
capability dac_read_search,
capability net_bind_service,
capability setgid,
capability setuid,
/data/www/safe/* r,
deny /data/www/unsafe/* r,
/etc/group r,
/etc/nginx/conf.d/ r,
/etc/nginx/mime.types r,
/etc/nginx/nginx.conf r,
/etc/nsswitch.conf r,
/etc/passwd r,
/etc/ssl/openssl.cnf r,
/run/nginx.pid rw,
/usr/sbin/nginx mr,
/var/log/nginx/access.log w,
/var/log/nginx/error.log w,
}
프로필은 로그 파일에 따라 생성되기 때문에 약간 달라 보일 수 있습니다.이것은 하나의 매개 변수를 연구하고 업데이트할 것인지, 아니면 이 파일을 대량으로 복제할 것인지, 그리고 자신의 서버 환경을 고려할 때 흔히 볼 수 있는 주의사항에 달려 있다.AppArmor 권한은 올바른 권한을 얻기 어려울 수 있으므로 이 예시 파일과 자동으로 생성된 파일을 기점으로 사용할 수 있지만 문제 해결을 준비하십시오.AppArmor Nginx 구성 파일이 준비되었습니다.aa를 사용하여 프로필을 강제 모드로 설정합니다.
sudo aa-enforce nginx
최신 변경 사항이 적용되는지 확인하려면 모든 구성 파일을 다시 로드하고 Nginx를 다시 시작하는 것이 좋습니다.다음을 입력합니다.sudo /etc/init.d/apparmor reload
sudo service nginx restart
상기 단계에서 오류가 발생하면 오류를 읽고 프로필을 꼼꼼히 검사한 다음/var/log/syslog를 검사하여 정확한 방향을 가리켜 주십시오.AppArmor 상태 확인:
sudo apparmor_status
Nginx 프로세스가 강제 모드에서 실행되는 것을 보셔야 합니다.브라우저로 돌아가 http://< 서버 IP>: 8080/safe/index에 액세스합니다.html.이 페이지를 볼 수 있을 것입니다.그런 다음 http://<서버 IP>:8080/비안전/인덱스에 액세스합니다.html.아래와 같은 오류 페이지를 보실 수 있습니다.이것은 우리의 프로필이 예상대로 작동한다는 것을 증명한다.

문제 해결
구성 파일이 강제 설정된 후 Nginx 서버를 시작할 수 없으면 구성 파일에 Nginx에 필요한 권한이 없을 수 있습니다.다음 사항을 확인해야 합니다.
예를 들어 개요 파일에 추상적/apache2common을 포함하는 것을 잊어버리면 다음과 같은 오류를 볼 수 있습니다.
[emerg] 3611#0: socket() 0.0.0.0:8080 failed (13: Permission denied)
실제 장면에서 새로운 응용 프로그램에 유용한 AppArmor 프로필을 얻기 위해서는 많은 시도와 오류가 필요하고 시간이 상당히 걸린다.결론
이 강좌를 통해 처음부터 AppArmor 프로필을 만드는 것을 배웠습니다.실제 장면에서 대형 응용 프로그램에 AppArmor를 사용하기 전에 더욱 엄격한 절차를 따라야 합니다.
우선, aa COMPLY 명령을 사용하여 고소 모드를 사용합니다.그리고 시스템 관리자는 보통 aalogprof 명령을 실행하기 전에 며칠 동안 기다려서 프로그램의 더 많은 흔한 동작을 기록할 수 있도록 합니다.생산 시스템에서 사용할 개요 파일을 만들려면 이렇게 하는 것이 좋습니다.