2014-07-10 2 views
6

노드 탄력적 인 Beanstalk 응용 프로그램이 실행 중이며 ELB가 실행 중입니다. 바로 지금은 AWS 샘플 노드 애플리케이션입니다. 이것은 개발 서버이기 때문에 실제 코드를 서버로 전송하기 전에 암호로 전체를 보호해야합니다 (클라이언트 검토 등을 위해 사용됩니다).AWS 노드 EB 응용 프로그램을 암호로 보호합니다.

이 작업을 수행하는 방법을 파악하는 데 많은 어려움이 있습니다. 응용 프로그램 코드가 /var/app/에 빠졌고, 보통 htaccess 파일을 설정할 곳이 /var/www/html/ (숨김 파일 없음)에 없습니다. 그것은 결코 사용한 적이없는 nginx 프록시를 사용하고 있으며 파일이 어떻게 제공되고 있는지 정확히 알지 못합니다.

이 서버를 잠그는 가장 좋은 방법은 무엇입니까? 보안 그룹? htaccess? 다른 것?

답변

2

보안 그룹은 원본 IP를 기반으로 만 차단되며 htaccess는 nginx에서 지원하지 않습니다. 대신 그들은 다음과 같은 구성을 지원 : 기본의 nginx 구성을 수정하는 탄성 콩나무의 .ebextensions를 사용해야합니다 이것을 달성하기 위해

server { 
    ... 
    auth_basic "closed website"; 
    auth_basic_user_file conf/htpasswd; 
} 

하지만. 전혀 쉬운 일이 아닙니다.

가장 빠른 방법은 노드 응용 프로그램 자체에서 HTTP 인증을 지원하는 것입니다. 이이 많은 가이드가 있지만 여기에 하나입니다 인스턴스가 자신의 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf는 다음과 같이 설정 한 것이다 Node.js를 콩나무 응용 프로그램에서 http://www.sitepoint.com/http-authentication-in-node-js/

+0

나는 여기서도 끝을 맺었다. [Passport] (http://passportjs.org/)는 특히 Express를 사용하여이를 달성하는 올바른 방법이었습니다. –

15

:

server { 
    listen 8080; 

    location/{ 
     proxy_pass http://nodejs; 
     proxy_set_header Connection ""; 
     proxy_http_version 1.1; 
     proxy_set_header  Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
    gzip on; 
} 

server { 
    listen 8080; 

    location/{ 
     proxy_pass http://nodejs; 
     proxy_set_header Connection ""; 
     proxy_http_version 1.1; 
     proxy_set_header  Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
     auth_basic "Restricted"; 
     auth_basic_user_file /etc/nginx/.htpasswd; 
    } 
    gzip on; 
} 

로그인 자격 증명을 containts /etc/nginx/.htpasswd에서 별도의 암호 파일로 : 그것은 다음과 같이 설정해야 당신이 원하는 무엇

이다.

1 단계 : 해당 지역의 리눅스 환경에 이동하여

sudo htpasswd -c .htpasswd someusernameofyourchoice 

가 .htpasswd 파일로 이동하고 생성 된 사용자 이름과 암호 줄을 당겨 입력합니다. 그것은이 같은 모양 :

someusernameofyourchoice:$apr1$.1EAU7DD$rt9jdihy1U.cFuBzJTMed. 

STEP 2 : (당신의 .git/디렉토리가 위치한) 노드 응용 프로그램의 루트 디렉토리에 지금

.ebextensions라는 숨겨진 디렉토리를 생성/

2 개의 파일을 만들어야하므로 .ebextensions/디렉토리로 이동하십시오.

3 단계 :

첫 번째 파일은 콩나무 응용 프로그램에 대한 귀하의 .htpasswd 파일을 생성합니다 config 파일 것입니다. 앞에서 생성 한 사용자 이름과 암호 해시를이 파일에 넣고 다음과 같이 이름을 지정하십시오.

00_nginx_htpasswd.설정

files: 
    "/etc/nginx/.htpasswd" : 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     someusernameofyourchoice:$apr1$.1EAU7DD$rt9jdihy1U.cFuBzJTMed. 

4 단계 :

당신이 당신의 탄성 콩나무 환경에 00_elastic_beanstalk_proxy.conf 파일을 업데이트됩니다 .ebextensions/디렉토리에 생성됩니다 두 번째 파일. 다음과 같이 이름은 다음과 같습니다

01_nginx_auth.config

files: 
    /tmp/deployment/nginx_auth.sh: 
    mode: "000755" 
    content: | 
     sed -i 's/$proxy_add_x_forwarded_for;/$proxy_add_x_forwarded_for;\n  auth_basic "Restricted";\n auth_basic_user_file \/etc\/nginx\/.htpasswd;\n/' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 
container_commands: 
    nginx_auth: 
    command: "/tmp/deployment/nginx_auth.sh" 

참고 : 만 암호 보호가 특정 환경에있을하려면 이러한 개발 환경으로. 환경 변수를 사용자 환경 (환경 설정> 소프트웨어 구성 패널의 beanstalk 대시 보드)에 전달한 다음 실행하기 전에 해당 환경 변수를 검사하는 조건부 파일을이 명령에 추가 할 수 있습니다. 이렇게하면 프로덕션 환경을 공개적으로 액세스 할 수있는 상태로두고 개발 환경을 암호로 보호 할 수 있습니다. 모든 것을 beanstalk 환경으로 밀어 넣으려고 git에 넣는 것처럼 매우 편리합니다. 그 추가와 수정 된 파일입니다 :

01_nginx_auth.config

files: 
    /tmp/deployment/nginx_auth.sh: 
    mode: "000755" 
    content: | 
     if [ "$NODE_ENV" == "development" ]; then 
     sed -i 's/$proxy_add_x_forwarded_for;/$proxy_add_x_forwarded_for;\n  auth_basic "Restricted";\n auth_basic_user_file \/etc\/nginx\/.htpasswd;\n/' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 
     fi 
container_commands: 
    nginx_auth: 
    command: "/tmp/deployment/nginx_auth.sh" 

STEP 5 : 당신이 당신의 .ebextensions/디렉토리에 생성 이러한 파일을 모두 갖게되면, 커밋

그리고 당신의 탄력있는 콩에 그것을 밀어 넣으십시오. 이제 1 단계에서 생성 한 사용자 이름과 암호 조합을 묻는 메시지가 표시됩니다.

+0

훌륭한 가이드! 방금 시도했는데 내 인스턴스에는'/ etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf'이 없었고'/ etc/nginx/conf.d/webapp.conf' 파일을 수정했습니다. 또한 나는이 라인의 끝 부분에서 무언가가 엉망이라고 생각한다./tmp/deployment/config/# etC# nginx # conf.d # 00_elastic_beanstalk_proxy.conf' –

+0

아마존은 환경 변수 접근 방법을 변경했습니다. 이제 다음과 같은 줄을 추가해야합니다 : 'NODE_ENV = \'/ opt/elasticbeanstalk/bin/get-config 환경 --output yaml | grep -oP 'NODE_ENV : \ K \ w +'\'' 어떤 이유로 get-config --key 옵션이'environment'에 대해 작동하지 않는 것 같습니다. – Andres

+0

위대한 답변입니다! 나는 S3에 .htpasswd 파일을 저장하는 것을 끝내었고 그렇게해서 소스 컨트롤에 파일의 내용이 없었습니다. 00_nginx_htpasswd.config의 "content : ..."행을 "source : [S3 URL Here]"로 대체하는 것만 큼 쉽습니다 (여기에 설명 된대로 적절한 액세스 권한을 이미 부여했다고 가정합니다. http://docs.aws. amazon.com/elasticbeanstalk/latest/dg/https-storingprivatekeys.html) – arknotts

0

Express.js을 사용하는 경우 basic-auth package을 사용하여 경량 미들웨어를 추가 할 수 있습니다. 필자가 필요로하는 것은 사이트를 일반인들과 잠그기위한 사용자 명과 암호 하나 뿐이었다. Elastic Beanstalk에서 Node.js 서버를 사용할 때이 시나리오에 대한 가장 쉬운 솔루션이었습니다.

var auth = require('basic-auth'); 

app.use(function(req, res, next) { 
    var credentials = auth(req); 

    if (!credentials || credentials.name !== 'buster' || credentials.pass !== 'getinfree') { 
    res.statusCode = 401; 
    res.setHeader('WWW-Authenticate', 'Basic realm="example"'); 
    res.end('Access denied.'); 
    } else { 
    next(); 
    } 
}); 

참고이 솔루션은 nginx를 직접적으로 방해하지 않고 노드 응용 프로그램 내에 코드를 추가해야합니다.

관련 문제