28 grudnia 2014 blog vps vnc mysql apache lighttpd ssh

Jak skonfigurować VPS pod własne potrzeby - java, php, mysql, ssh, vnc.

Założenia:

Instalacja potrzebnych pakietów

apt-get update; apt-get dist-upgrade
apt-get install aptitude
# ustawienie strefy czasowej
dpkg-reconfigure tzdata

sudo aptitude install htop mercurial git mc screen tmux dtach curl dnsutils netcat netcat6

Dodanie użytkownika

adduser dmn
usermod -a -G sudo dmn
usermod -a -G www-data dmn
usermod -a -G users dmn
usermod -a -G fuse dmn

Bezpieczeństwo

SSH

Kopiowanie własnego klucza SSH

ssh-copy-id dmn@new.devsite.pl
ssh dmn@new.devsite.pl

Edycja ustawień SSH

sudo vim /etc/ssh/sshd_config

Zablokowanie logowania root

PermitRootLogin no

Restart SSH

sudo service ssh restart

Firewall

Edycja firewalla, plik /etc/iptables.firewall.rules

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

Edycja firewalla dla IPv6, plik /etc/ip6tables.firewall.rules

*filter

#-A INPUT -i lo -j ACCEPT

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT

-A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-A INPUT  -p ipv6-icmp -j ACCEPT
-A OUTPUT -p ipv6-icmp -j ACCEPT

-A INPUT -p tcp --destination-port 80 -j ACCEPT
-A INPUT -p tcp --destination-port 443 -j ACCEPT

COMMIT

Aktywacja firewalla

sudo touch /etc/network/if-pre-up.d/firewall
sudo chmod +x /etc/network/if-pre-up.d/firewall
sudo vim /etc/network/if-pre-up.d/firewall

/etc/network/if-pre-up.d/firewall

#! /usr/bin/env sh
/sbin/iptables-restore < /etc/iptables.firewall.rules
/sbin/ip6tables-restore < /etc/ip6tables.firewall.rules

Język

sudo apt-get install localepurge
sudo dpkg-reconfigure localepurge

vim /etc/profile.d/language.sh
export LC_ALL=pl_PL.UTF-8
export LANG=pl_PL.UTF-8
chmod +x /etc/profile.d/language.sh

VNC

Instalacja pakietów

sudo aptitude install lxde tightvncserver firefox pidgin chromium-browser
sudo aptitude install dmz-cursor-theme clearlooks-phenix-theme

#sprawdzenie zainstalowanego motywu
find /usr/share/icons ~/.icons -type d -name "cursors"
#/usr/share/icons/DMZ-Black/cursors
#/usr/share/icons/DMZ-White/cursors

Skrypt startowy ~/bin/vncstart

vncserver -kill :2
vncserver :2 -geometry 1920x1080 -dpi 96 -depth 24 -nevershared

Plik .Xresources

Xft.dpi:                96
Xft.antialias:          true
Xft.hinting:            true
Xft.hintstyle:          hintfull
Xft.rgba:               rgb

XTerm*termName:  xterm-256color
*customization: -color

Xcursor.theme:          DMZ-White

!--< xterm >--!
XTerm*utf8: 1
XTerm*scrollBar: false
XTerm*curses: true
XTerm*locale: utf8
xterm*jumpScroll:       true
xterm*multiScroll:      true
xterm*saveLines:        1024
xterm*cursorBlink:      false
xterm*scrollTtyKeypress:true
xterm*scrollTtyOutput:  false
xterm*faceName:         Terminus
xterm*faceSize:         12

~/.vnc/xstartup

#! /usr/bin/env bash

export LANG=pl_PL.utf8
export XKL_XMODMAP_DISABLE=1

xmodmap -e "pointer = 1 2 3 4 5 8 9 10 11 12 6 7" &
setxkbmap -option terminate:ctrl_alt_bksp
setxkbmap pl
gconftool-2 --type=list --list-type=string --set /desktop/gnome/peripherals/keyboard/kbd/layouts '[pl]'

# cd /etc/fonts/conf.d; sudo ln -s ../conf.avail/70-yes-bitmaps.conf
# dodac do ~/.xinitrc: xset +fp /usr/share/fonts/local ; xset fp rehash

cd

xsetroot -solid '#101010' &
## DPMS monitor setting (standby -> suspend -> off) (seconds)
#xset dpms 300 600 900 &
#clipit &

#/usr/bin/i3 &

xrdb ~/.Xresources &
/usr/bin/lxsession -s LXDE &

Uruchomienie na serwerze

chmod +x ~/.vnc/xstartup ~/bin/vncstart
vncstart

Połączenie z innego komputera

Ponieważ port do połączeń VNC nie został odblokowany przy konfiguracji firewalla, należy się połączyć do sesji używając tunelowania przez SSH. Dzięki temu: po pierwsze - usługa VNC nie jest wystawiona dla "całego świata", a po drugie - zyskiem jest zaszyfrowanie połączenia, które przy zwykłym VNC byłoby łatwe do podejrzenia.

ssh dmn@new.devsite.pl -L 5902:127.0.0.1:5902
vncviewer :2
# dla tighvnc:
vncviewer -encodings tight -quality 6 -fullscreen :2
# dla tigervnc:
vncviewer PreferredEncoding=Tight QualityLevel=6 -FullScreen :2
# wyświetlenie menu i wyjście z trybu pełnego ekranu: F8

Połączenie się używając nowej sesji X jest użyteczne choćby na Raspberry Pi, który może działać jako thin-client. Należy pamiętać, że wpisanie hasła do otwarcia połączenia VNC nie będzie możliwe dopóki kursor myszy nie znajdzie się nad dialogiem - jest to domyślne zachowanie powłoki X bez żadnego managera okien. Zakończenie aplikacji jest możliwe po wybraniu odpowiedniej opcji z menu wyświetlającego się po naciśnięciu F8.

xinit /usr/bin/vncviewer -fullscreen :2 -- :2 -nolisten tcp -br +bs -dpi 96 vt$XDG_VTNR

Syncthing

Instalacja add-apt-repository oraz dodanie repozytorium syncthing

sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:ytvwld/syncthing
sudo apt-get update
sudo apt-get install syncthing

Dodanie do automatycznego uruchamiania

crontab -l # edycja crontab
PATH=/bin:/sbin:/usr/bin:/usr/sbin:${HOME}/bin:${HOME}/bin/scripts
@daily crontab -l > "${HOME}/crontab.`hostname`"
@reboot syncthing &

Problemy

----
http://askubuntu.com/questions/563702/rsyslogd-using-100-cpu-on-ubuntu-14-04
service rsyslog stop
sed -i -e 's/^\$ModLoad imklog/#\$ModLoad imklog/g' /etc/rsyslog.conf
service rsyslog start
---

Java

Należy ściągnąć potrzebne oprogramowanie. Podstawowy zestaw to:

Instalacja

# rozpakowanie
tar -xzvf jdk-8u25-linux-i586.tar.gz ; tar -xzvf apache-maven-3.2.5-bin.tar.gz; tar -xzvf apache-tomcat-8.0.15.tar.gz
chmod +x netbeans-*.sh
# katalog docelowy
mkdir ~/opt
mv apache-maven-3.2.5 apache-tomcat-8.0.15 jdk1.8.0_25/ ~/opt
cd ~/opt/
# linki ułatwiające konfigurację
ln -s apache-maven-* apache-maven; ln -s apache-tomcat-* apache-tomcat; ln -s jdk1.8.* jdk; ln -s jdk1.8.* jdk1.8

Dodać do .bashrc

export JDK_HOME="${HOME}/opt/jdk"
export JAVA_HOME="${JDK_HOME}/jre"
export M2_HOME="${HOME}/opt/apache-maven"

export PATH=$HOME/bin:$HOME/scripts:$HOME/opt:$HOME/opt/bin:$JDK_HOME/bin:$JAVA_HOME/bin:$M2_HOME/bin:$PATH

Netbeans musi być zainstalowany podczas połączenia VNC

chmod +x netbeans*sh; ./netbeans*sh --javahome ~/opt/jdk

Apache

SSL

Poniżej przykład dla certyfikatu podpisanego przez użytkownika. Można również użyć darmowego podpisanego certyfikatu SSL.

sudo -s
cd /etc/apache2
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key
chmod 600 server.key
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

cd /etc/apache2/mods-enabled
ln -s ../mods-available/ssl.load 
ln -s ../mods-available/ssl.conf 
ln -s ../mods-available/socache_shmcb.load 
ln -s ../mods-available/proxy.load 
ln -s ../mods-available/proxy.conf 
ln -s ../mods-available/proxy_http.load 

cd /etc/apache2/sites-enabled
cp ../sites-available/default-ssl.conf default-ssl.conf 
vim default-ssl.conf 
    # dodać:   SSLCertificateFile    /etc/apache2/server.crt
    # dodać:   SSLCertificateKeyFile /etc/apache2/server.key
service apache2 restart

PHP

sudo aptitude install php5 php5-mysql php5-recode phpsysinfo php5-gnupg php5-sqlite php5-apcu php5-curl mariadb-server mariadb-client

mysql -u root
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('yourpassword');
CREATE DATABASE database1;
GRANT ALL PRIVILEGES ON database1.* TO 'yourusername'@'localhost' IDENTIFIED BY 'yourpassword';

Tiny Tiny RSS

mkdir ~/http; cd ~/http
wget https://github.com/gothfox/Tiny-Tiny-RSS/archive/1.15.3.tar.gz
tar -xzvf 1.15.3.tar.gz

mv Tiny-Tiny-RSS-1.15.3/ rss
chmod 777 rss
cd rss; chmod -R 777 cache; chmod -R 777 feed-icons; chmod -R 777 lock

VirtualHost

/etc/apache2/sites-enabled/redirectToHttps.conf

<VirtualHost *:80>
    ServerName new.devsite.pl
    ServerAlias new.devsite.pl
    Redirect permanent / https://new.devsite.pl
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

/etc/apache2/sites-enabled/devsite-pl.conf

<IfModule mod_ssl.c>
    <VirtualHost new.devsite.pl:443>
       ServerName new.devsite.pl
       ServerAlias new.devsite.pl

       ServerAdmin webmaster@localhost
       DocumentRoot /home/dmn/http

       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined

       <Directory "/home/dmn/http">
         Require all granted
       </Directory>

       <IfModule mod_proxy.c>
         ProxyPreserveHost On
         ProxyPass /blog/ http://devsite.pl:80/
         ProxyPassReverse /blog/ http://devsite.pl:80/
       </IfModule>

       SSLEngine on

       SSLCertificateFile    /etc/apache2/server.crt
       SSLCertificateKeyFile /etc/apache2/server.key

       <FilesMatch "\.(cgi|shtml|phtml|php)$">
          SSLOptions +StdEnvVars
       </FilesMatch>
       <Directory /usr/lib/cgi-bin>
          SSLOptions +StdEnvVars
       </Directory>

       BrowserMatch "MSIE [2-6]" \
          nokeepalive ssl-unclean-shutdown \
          downgrade-1.0 force-response-1.0
       BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    </VirtualHost>
</IfModule>

Lighttpd

Dla maszyn z mniejszą ilością pamięci lepiej się sprawdzi Lighttpd z PHP w trybie CGI.

sudo aptitude install lighttpd php5-cgi

Aby uzyskać certifikat w formacie PEM, należy połączyć 2 pliki (wszystkie powinny być w folderze z konfiguracją):

cat server.key server.crt > lighttpd.pem

Na końcu /etc/lighttpd/lighttpd.conf dopisujemy:

include "/etc/lighttpd/devsite-pl.conf"

/etc/lighttpd/devsite-pl.conf

server.modules += ( "mod_cgi" )
# already loaded server.modules += ( "mod_alias" )

$SERVER["socket"] == ":443" {
    ssl.engine = "enable" 
    ssl.pemfile = "/etc/lighttpd/lighttpd.pem"
    # w przypadku wykupionego certyfikatu: ssl.ca-file = "/etc/lighttpd/ca.crt"
    setenv.add-response-header  = (
       "Strict-Transport-Security" => "max-age=63072000",
       "X-Frame-Options" => "DENY"
    )
    $HTTP["useragent"] =~ "MSIE" {
       server.max-keep-alive-requests = 0
    }
}

$HTTP["scheme"] == "http" {
    $HTTP["host"] == "new.devsite.pl" {
       url.redirect = (".*" => "https://new.devsite.pl$0")
       setenv.add-environment = ( "HTTPS" => "on" )
    }
}

$HTTP["host"] == "new.devsite.pl" {
    server.document-root = "/home/dmn/http/"
    alias.url = ( 
       "/pub" => "/home/dmn/pub/",
    )
    $HTTP["url"] =~ "^/pub/" {
       dir-listing.activate  = "enable"
       server.follow-symlink = "enable"
    }
    cgi.assign = (
       ".pl"  => "/usr/bin/perl",
       ".php" => "/usr/bin/php-cgi",
    )
} else $HTTP["host"] == "projects.new.devsite.pl" {
    proxy.server = ( "" => (( "host" => "127.0.0.1", "port" => 8080 )) )
} else $HTTP["host"] =~ ".*" {
    url.redirect-code=404
    url.redirect = ( ".*" => "http://devsite.pl" )
}

Linki