Monday 7 November 2011

Instalacja Node.js wraz z bezpiecznym tunelem oraz dodatkowymi modułami (socket.io, libxmljs, express) na CentOS 5.x

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