Jako, że w pracy wdrażamy nowy projekt dla klienta pojawił się problem wykorzystania Node.js. Sam framework jest podobno przyjemny i dobry do pisania takich rzeczy jak chat, ale że jest to projekt nowy i oparty w pełni o JavaScript więc powstał dość poważny problem - bezpieczeństwo serwerów, na których usługa zostanie wystawiona. Troszkę się naczytałem o security failach Node.js, więc postanowiłem go zabezpieczyć. Na pierwszy ogień poszedł Nginx. Wybór padł na niego, bo wszyscy taką instalację zalecają. Niestety skończyło się na porażce - websocket i Nginx w ogóle ze sobą nie współpracują, a wszystko trzeba robić przez moduły niekoniecznie supportowane przez programistów tego proxy. Ostatecznie wszystko udało się postawić na Stunnelu. Wybór tego programu jest nieprzypadkowy - dzięki takiemu zabiegowi połączenie aplikacji klienta z serwerem jest w pełni szyfrowane i zabezpieczone certyfikatem, a do Node.js nie ma bezpośredniego dostępu - wszystko odbywa się za pośrednictwem bezpiecznego tunelu.
Poniżej przedstawiam, jak krok po kroku można zainstalować i skonfigurować te programy do wspólnego działania na CentOS w wersji co najmniej 5 wraz z dodatkowymi modułami - dość często wykorzystywanymi do tworzenia aplikacji w Node.js - socket.io, libxmljs, express.
Zalecam utworzenie nowego użytkownika specjalnie dla frameworku, ze względu na bezpieczeństwo systemu :-).# To nam bedzie potrzebne do instalacji openssl
root 01. rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
root 02. rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
# Instalujemy openssl
root 03. yum -y install python libssl-dev openssl-devel
# Tworzymy nowego uzytkownika
root 04. useradd node -d /home/node
root 05. passwd node
root 06. su node
# Teraz juz jako nowy uzytkownik sciagamy i kompilujemy node
node 07. wget http://nodejs.org/dist/node-v0.4.12.tar.gz
# najnowsza obecnie, kompatybilna wersja z wspomnianymi modułami to: v0.4.12
node 08. tar xvzf node-v0.4.12.tar.gz
node 09. cd node-v0.4.12
node 10. mkdir ~/local
node 11. ./configure --prefix=$HOME/node
node 12. make
# Instalujemy lokalnie! nie jako root!
node 13. make install
# Tworzymy sciezki dostepu
node 14. export PATH=$HOME/node/bin:$PATH
node 15. echo "export PATH=$HOME/node/bin:$PATH" >> /home/node/.bashrc
# Pobieramy i instalujemy manager pakietow npm
node 16. curl http://npmjs.org/install.sh | sh
# Instalacja modulu express nie stanowi problemu
node 17. npm install express
node 18. cd ~
# Instalacja socket.io wymaga nowej wersji tar, ktora sobie skompilujemy
node 19. wget http://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz
node 20. tar zxvf tar-1.26.tar.gz
node 21. cd tar-1.26
node 22. ./configure
node 23. make
# A teraz jako root
root 24. make install
node 25. npm install socket.io
# Bez tego nie zainstalujemy libxmljs
root 26. yum install scons
node 27. npm install libxmljs
node 28. mkdir ~/cert
node 29. cd ~/cert
# stunnel wymaga certyfikatu, do laczenia sie ze strona
node 30. openssl req \
-x509 -nodes -days 365 \
-newkey rsa:1024 -keyout certyfikat.pem -out certzfikat.pem
root 31. yum install stunnel
# Stunnel zabezpieczy dziurawy jak sito nodejs i dodatkowo wszystko zaszyfruje i wrzuci po https
root 32. echo "cert = /home/node/cert/certyfikat.pem \
[https] \
accept = 443 \
connect = 3366" >> /etc/stunnel/node
root 33. chmod 755 /home/node/cert/certyfikat.pem
# Dodajemy regulke do firewalla, ktora wpuści nas na porcie 443
root 34. system-config-securitylevel ---> Dostosuj ---> [x] Bezpieczne WWW [HTTPS] ---> OK
Jak widać, całość chwilę zajmuje, ale daję słowo - opłaca się. Ograniczenie dostępu do Node.js poprzez tunel powoduje podwyższenie bezpieczeństwa pracy. Konfiguracja stunnel jest tutaj oczywiście przykładowa - po wywołaniu programu będzie nasłuchiwać na porcie 3366, a tam będziemy umieszczać naszą aplikację napisaną w Node.js. Oczywiście należy pamiętać jeszcze o zabezpieczeniu serwera i konta użytkownika node przed osobami trzecimi :-).
No comments:
Post a Comment