2014-07-10 12 views
6

Mam uruchomioną aplikację Node Elastic Beanstalk (chociaż ELB). W tej chwili jest to tylko przykładowa aplikacja węzła AWS na serwerze. Ponieważ jest to serwer programistyczny, zanim będę mógł przesłać mój aktualny kod do serwera, muszę zabezpieczyć całą zawartość hasłem (służy to do przeglądania klienta itp.).Ochrona hasłem Aplikacja AWS Node EB

Mam mnóstwo kłopotów próbując dowiedzieć się, jak to zrobić. Wygląda na to, że kod aplikacji został upuszczony w /var/app/ i nie ma w nim nic w /var/www/html/ (bez ukrytych plików), w którym normalnie zostałby ustawiony plik htaccess. Używa proxy nginx, którego nigdy nie używałem i nie jestem do końca pewien, w jaki sposób pliki są wyświetlane.

Jaki jest najlepszy sposób na zablokowanie tego serwera? Grupy bezpieczeństwa? htaccess? Coś innego?

Odpowiedz

2

Grupy zabezpieczeń będą blokować tylko na podstawie źródłowego adresu IP, a htaccess nie jest obsługiwany przez nginx. Zamiast wspierać ich konfigurację tak:

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

Ale aby to osiągnąć trzeba użyć elastycznego beanstalk na .ebextensions zmodyfikować domyślną konfigurację Nginx. To wcale nie jest łatwe.

Najszybszym rozwiązaniem jest prawdopodobnie obsługa uwierzytelniania HTTP w samej aplikacji węzła. Istnieje wiele przewodników do tego, ale tutaj jest jeden: http://www.sitepoint.com/http-authentication-in-node-js/

+0

Skończyło się na tym, że dostałem się tutaj. [Passport] (http://passportjs.org/) był właściwą drogą do osiągnięcia tego celu, szczególnie w przypadku Express. –

15

W aplikacji node.js beanstalk instancje będą miały swoje /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf skonfigurować tak:

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

Co chcesz, jest na to, aby być ustawione tak:

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

z osobnym pliku haseł w /etc/nginx/.htpasswd że containts swoje dane logowania.

KROK 1: udać się do lokalnego środowiska Linux i wprowadź

sudo htpasswd -c .htpasswd someusernameofyourchoice 

nawigować do tego pliku .htpasswd i wyciągnąć linię nazwę użytkownika i hasło wygenerowane. Będzie to wyglądać mniej więcej tak:

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

Krok 2:

Teraz w katalogu głównym aplikacji węzeł (gdzie .git/katalogu znajduje) utworzyć ukryty katalog o nazwie .ebextensions/

przejdź do tego katalogu .ebextensions /, aby utworzyć 2 pliki.

KROK 3:

Pierwszy plik będzie plik konfiguracyjny, który wygeneruje plik .htpasswd na aplikacji beanstalk. Umieść nazwę użytkownika i hasło, które wcześniej wygenerowałeś w tym pliku, i nadaj im następujące nazwy:

00_nginx_htpasswd.config

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

KROK 4:

Drugi plik zostanie utworzony w katalogu/.ebextensions będzie zaktualizować plik 00_elastic_beanstalk_proxy.conf na dysku elastycznego środowiska beanstalk. Nazwa jest następująca:

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" 

UWAGA: Jeśli chcesz tylko ochrona hasłem, aby być w pewnym środowisku, takim jak środowisko programistyczne. Możesz przekazać zmienną środowiskową do swojego środowiska (w konfiguracjach> panelu Konfiguracje oprogramowania na pulpicie nawigacyjnym beanstalk), a następnie możesz dodać warunkową do komendy tego pliku, która sprawdza zmienną środowiskową przed jej uruchomieniem. W ten sposób można zabezpieczyć hasłem środowisko programistyczne, pozostawiając środowisko produkcyjne bezpłatne dla publiczności. Gdy wkładasz wszystko do git, aby przenieść je do twojego środowiska beanstalk, jest to bardzo przydatne. Poniżej znajduje się zmodyfikowany plik z tymi dodatkami:

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" 

KROK 5:

Gdy masz obu tych plików utworzonych w .ebextensions/katalogu, popełnić je i popchnij je do swojej elastycznej fasoli. Powinieneś teraz zostać poproszony o podanie kombinacji nazwy użytkownika i hasła wygenerowanej w kroku 1.

+0

Świetny przewodnik! Po prostu próbowałem to zrobić i na moim wystąpieniu nie było '/ etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf' i I i modyfikować'/etc/nginx/conf.d/webapp.conf'. Myślę też, że coś jest popsute na końcu tej linii, prawda? '/ tmp/deployment/config/# etC# nginx # conf.d # 00_elastic_beanstalk_proxy.conf' –

+0

Amazon zmienił sposób uzyskiwania dostępu do zmiennych środowiskowych. Teraz musisz dodać linię typu: 'NODE_ENV = \'/opt/elasticbeanstalk/bin/get-config environment - output yaml | grep -oP 'NODE_ENV: \ K \ w +' \ '' grep, ponieważ z jakiegoś powodu opcja get-config --key nie działa dla 'środowiska' – Andres

+0

Świetna odpowiedź! Skończyło się na zapisaniu pliku .htpasswd na S3 i przeciągnięciu go w ten sposób, więc nie miałem zawartości pliku w kontroli źródła. Jest to tak proste, jak zastąpienie linii "content: ..." 00_ininx_htpasswd.config słowem "source: [URL S3 tutaj]" (zakładając, że już dałeś odpowiedni dostęp, jak opisano tutaj: http://docs.aws. amazon.com/elasticbeanstalk/latest/dg/https-storingprivatekeys.html) – arknotts

0

Jeśli używasz Express.js, możesz dodać lekkie oprogramowanie pośrednie, korzystając z basic-auth package. W moim przypadku wszystko, czego potrzebowałem, to jedna nazwa użytkownika i hasło, aby zablokować witrynę publicznie. To było najłatwiejsze rozwiązanie dla tego scenariusza podczas korzystania z serwera Node.js na 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(); 
    } 
}); 

Uwaga: to rozwiązanie wymaga dodania kodu w aplikacji węzła, który nie zakłóca bezpośrednio nginx.