Basic Secure Server

Author: Nikko Enggaliano Date: Jan 25, 2019 Updated On: Jan 25, 2019
Categories: security
Tags: secure

Ubuntu Server Hardening

Environment

1
2
3
4
5
Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-43-generic x86_64)
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

Untuk servernya saya mengunakan Ubuntu 18 Terbaru. Meskipun security defaultnya sudah cukup baik, mari kita lebih optimasi!

Secure SSH

SSH adalah fitur yang paling rawan menjadi sasaran Attacker untuk hack server kita. Berikut langkah langkah basic securenya.

List Secure SSH

  1. Ganti Port Default SSH
  2. Gunakan Private key untuk login
  3. Jangan ijinkan user root untuk login
Ganti Port Default SSH

Cara mengantinya adalah. Kita perlu mengedit file /etc/ssh/sshd_config dan Mencari kata # Port 22. Kita bisa mengunakan vim atau nano untuk mengedit.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ sudo nano /etc/ssh/sshd_config

# $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.

Port 2121 #Hilangkan tanda pagar (#) dan ganti dengan value random.

$ sudo service sshd restart

Selamat port SSH kalian sudah terganti. Untuk login sekarang mengunakan option

ssh user@ip -p port

Private Key untuk Login

Pertama Kita generate key nya di machine local kita dengan perintah ssh-keygen Lalu enter terus sampai terlihat seperti dibawah ini.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nep/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nep/.ssh/id_rsa.
Your public key has been saved in /home/nep/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:lz1mQ81JoInsyUfUyqX+34N4wonyPFNNrQdiJVUqilk nep@NikkoEnggaliano
The key's randomart image is:
+---[RSA 2048]----+
| ..ooo. |
| . o +o=.. |
| oE+=+.= |
| o+o=*.o . |
| oSo= X o |
| o.+ = . |
| +.o o |
| ..+ =.o o |
| ooo o.. o|
+----[SHA256]-----+

Kedua kita copy file id_rsa.pub ke server kita

1
2
$ cat /home/nep/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUFL9sm2q2La5Xt6O6AzpfUz6ywyfSyIlMhIEr71OdmHTlt+wnAeEVCLY+/RQSvHsYa1ernveEVsSKn6COcx8BffChjAGSplc9SqUuSNMx0s2v/Ih01OGQ3BMfdeFcCjleCqyVOxV7oko/MsX3mSBySMyOyymXKnNALckKE3wtFfFbTVVdNO9lNex035FD4shkOO0WVHDvJZpqH9Vin1dSkN1xkAmoND/BKP4M4Y1kl/x4jovMB/cURBVg1AJIG2P0RSl8YApmf4E9hP5zgYTLJchhnG9bh4QwiFQl4lNH/QJY0EzoBE6D1ZSTiRfroiGW7cNbFBBlsSj12KFD3a15 nep@NikkoEnggaliano

Ketiga kita buat sebuah file authorized_keys

1
2
$ sudo touch authorized_keys
$ sudo nano authorized_keys

Isi dengan hasil dari cat id_rsa.pub

Keempat kita tinggal login dengan file id_rsa

1
2
3
$ cp id_rsa /home/nep/ssh.txt #copy filenya ke dir sembarang
$ chmod 0600 /home/nep/ssh.txt #mengubah permission
$ ssh -i ssh.txt sushi@192.168.78.129 -p 2121 #Tinggal login
  • -i Untuk identitas private key
  • ssh.txt Untuk file private key
  • -p Untuk port 2121 Isi portnya
Jangan ijinkan root user untuk login ssh

Root user adalah user tertinggi di unix, Tidak baik jika harus digunakan sehari hari dan meminimalisir hal hal yang tidak diinginkan, Maka dari itu kita juga harus membatasi user root ini dari login ssh dengan cara.

1
2
3
4
5
6
7
8
9
$ sudo nano /etc/ssh/sshd_config

# Authentication:

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

Kita ubah value dari #PermitRootLogin prohibit-password menjadi PermitRootLogin no

1
$ service ssh restart

Dengan begini user root sudah bisa untuk login ssh.

Secure Web Server

List Secure Web Server

  1. Tidak membuka port database ke public
  2. Mengubah dir phpmyadmin ke akses uri yang lain
  3. Tidak memberikan akses shell untuk user www-data
  4. Disable fungsi shell pada php.ini jika tidak diperlukan
  5. Pasang login admin palsu

Secara default port database akan tertutup bagi public, tapi ada beberapa mungkin miss configurasi yang membuat port 3306 (port database) terbuka untuk public. Salah satunya port ini terbuka biasanya untuk akses mysql remote. Kalian juga bisa menganti port 3306 dengan cara.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf


[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking


## Tinggal ganti variable port

$ sudo service mysql restart
Mengubah akses uri phpmyadmin

Secara default setelah istalasi adalah akses uri untuk phpmyadmin adalah http://domain/phpmyadmin namun kita juga dapat menganti akses uri ini dengan cara.

  1. Jika kalian tidak melakukan symlink

    1
    2
    3
    4
    5
    $ sudo nano /etc/phpmyadmin/apache.conf

    Alias /phpmyadmin /usr/share/phpmyadmin

    #tinggal ubah /phpmyadmin menjadi terserah mungkin /pythonmyadmin
  2. Jika kalian melakukan symlink langsung

    1
    2
    3
    4
    5
    6
    $ sudo ln -s /usr/share/phpmyadmin /var/www/html

    #jika kalian melakukan perintah itu saat instalasi maka tinggal mengubah nama di dir /var/www/html#

    $ cd /var/www/html
    $ mv /phpmyadmin /pythonmyadmin #Ganti dengan sesuka kalian
Disable shell untuk www-data

www-data adalah user untuk web server ubuntu, User ini sebaikan tidak dikasih akses shell.

1
2
3
4
$ cat /etc/passwd
--Snip--
www-data:x:33:33:www-data:/var/www:/bin/sh
--Snip--

Biasanya user www-data memiliki akses shell sh. Jika iya tingga diubah ke

/usr/sbin/nologin atau /bin/false

1
2
3
4
5
6
$ sudo nano /etc/passwd
$ cat /etc/passwd

--Snip--
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
--Snip--
Disable fungsi php yang berbahaya pada php.ini

Beberapa fungsi php juga harus kita disable pada php.ini fungsi2 ini biasanya berhubungan dengan shell, read file, write file. Sebaiknya fungsi2 itu dimatikan jika tidak dipakai juga.

Pertama untuk mencari php.ini kita bisa melihat dari phpinfo() berikut tata caranya:

  1. Buat file nama info.php pada /var/www/html atau dir web kalian
  2. Isi dengan kode <?php phpinfo();

Lihat pada baris

Loaded Configuration File -> /etc/php/7.2/apache2/php.ini

Oke jadi dir php.ini ada di /etc/php/7.2/apache2/php.ini

Kita tingga edit file tersebut jika kalian mengunakan nano tinggal CTRL+W dan ketikan disable_functions Maka anda akan langsung diarahkan ke baris yang kita edit.

1
$ sudo nano /etc/php/7.2/apache2/php.ini

Dan tambahkan blacklist berikut ini.

1
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Lalu ada tambahan lagi yaitu allow_url_include meski defaultnya sekarang sudah off. Lebih baik dipastikan lagi. CTRL+W dan ketikan allow_url_

1
2
allow_url_fopen=Off
allow_url_include=Off

Selesai dan restart web servernya.

1
$ sudo system apache2 restart
Fake login

Membuat login palsu cukup membantu membuat bingung orang2 yang akan berniat jail pada web kita. Secara simple tingga mendownload template login dan membuat banyak dir dir seperti /admin /administrator dll. Dan jangan lupa secure login admin dengan nama acak!