2014-07-10 19 views
6

Ho una app Node Elastic Beanstalk attiva e funzionante (anche se ELB). Al momento è solo l'applicazione Node di esempio AWS sul server. Poiché si tratta di un server di sviluppo, prima di poter inviare il mio codice effettivo al server è necessario proteggere con password l'intera cosa (questa deve essere utilizzata per la revisione del client, ecc.).Protezione password AWS Node Applicazione EB

Sto avendo un sacco di problemi cercando di capire come farlo. Sembra che il codice dell'applicazione sia sceso nel /var/app/ e non c'è nulla in /var/www/html/ (nessun file nascosto) dove normalmente installerei un file htaccess. Sta usando il proxy nginx, che non ho mai usato, e non sono esattamente sicuro di come vengono serviti i file.

Qual è il modo migliore per bloccare questo server? Gruppi di sicurezza? htaccess? Qualcos'altro?

risposta

2

I gruppi di sicurezza bloccano solo in base all'IP di origine e htaccess non è supportato da nginx. Invece sostengono configurazione come questa:

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

Ma per raggiungere questo obiettivo è necessario utilizzare elastica beanstalk di .ebextensions di modificare la configurazione di default nginx. Non è affatto facile.

Il modo più veloce per voi è probabilmente quello di supportare l'autenticazione HTTP all'interno dell'app stessa. Ci sono molte guide a questo, ma qui è uno: http://www.sitepoint.com/http-authentication-in-node-js/

+0

Ho finito per arrivare anche qui. [Passport] (http://passportjs.org/) era il modo giusto per raggiungere questo obiettivo, specialmente con Express. –

15

Nell'applicazione Node.js Beanstalk le istanze avranno il loro /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf impostato in questo modo:

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; 
} 

quello che vuoi è per essere impostato come questo:

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; 
} 

Con un file di password separato /etc/nginx/.htpasswd che containts le credenziali di accesso.

FASE 1: Vai al tuo ambiente Linux locale e immettere

sudo htpasswd -c .htpasswd someusernameofyourchoice 

spostarsi in quel file .htpasswd ed estrarre la linea nome utente e la password che hai generato. Sarà simile a questa:

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

FASE 2:

Ora nella root directory della vostra applicazione nodo (dove si trova il tuo .git/directory) creare una directory nascosta denominata .ebextensions/

navigare nella directory .ebextensions poiché è necessario creare 2 file.

FASE 3:

Il primo file sarà il file di configurazione che genererà il file .htpasswd sulla vostra applicazione pianta di fagioli. Inserire il nome utente e l'hash della password precedentemente generati in questo file e denominarlo come segue:

00_nginx_htpasswd.config

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

FASE 4:

Il secondo file può creare nella vostra .ebextensions/directory aggiornerà il file 00_elastic_beanstalk_proxy.conf al proprio ambiente elastico pianta di fagioli. Nome è il seguente:

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" 

NOTA: Se si desidera solo la protezione con password per essere in un certo ambiente, come l'ambiente di sviluppo. È possibile passare una variabile di ambiente nel proprio ambiente (nel pannello di configurazione> Configurazioni software sul dashboard di beanstalk) e quindi aggiungere un comando condizionale al comando di questo file che controlla la variabile di ambiente prima dell'esecuzione. In questo modo è possibile proteggere con password il proprio ambiente di sviluppo lasciando libero accesso al proprio ambiente di produzione. Come stai mettendo tutto in git per spingerlo nel tuo ambiente di beanstalk, questo è molto utile. Quello che segue è il file modificato con quelle aggiunte:

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" 

FASE 5:

Una volta che avete entrambi questi file creati nel tuo .ebextensions/directory, impegnarli e spingili al tuo fagiolo elastico. A questo punto dovrebbe essere richiesta la combinazione di nome utente e password generata nel passaggio 1.

+0

Ottima guida! Ho appena provato a farlo e nella mia istanza non c'era '/ etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf' e io e per modificare'/etc/nginx/conf.d/webapp.conf'. Inoltre penso che qualcosa sia incasinato alla fine di questa linea, giusto? '/ tmp/deployment/config/# etC# nginx # conf.d # 00_elastic_beanstalk_proxy.conf' –

+0

Amazon ha cambiato il modo di accedere alle variabili di ambiente. Ora devi aggiungere una riga come: 'NODE_ENV = \'/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'NODE_ENV: \ K \ w +' \ '' grep perché per qualche motivo l'opzione get-config --key non sembra funzionare per 'environment' – Andres

+0

Ottima risposta! Ho finito per salvare il file .htpasswd su S3, e tirandolo in quel modo in modo da non avere il contenuto del file nel controllo del codice sorgente. È facile come sostituire la riga "content: ..." di 00_nginx_htpasswd.config con "source: [S3 URL Here]" (supponendo che tu abbia già fornito l'accesso corretto come descritto qui: http://docs.aws. amazon.com/elasticbeanstalk/latest/dg/https-storingprivatekeys.html) – arknotts

0

Se si utilizza Express.js è possibile aggiungere un middleware leggero utilizzando basic-auth package. Nel mio caso, tutto ciò di cui avevo bisogno era un nome utente e una password per bloccare il sito dal pubblico. Questa era la soluzione più semplice per questo scenario quando si utilizza un server Node.js su Elastic Beanstalk.

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(); 
    } 
}); 

Nota che questa soluzione richiede l'aggiunta del codice all'interno del vostro Nodo app, interferendo non direttamente con nginx.

Problemi correlati