Check Web Security pake Nikto

ada bbrp tools untuk checknya, sementara ini gw pake tools namanya Nikto

Cara installnya gampang, kalo mac tinggal

brew install nikto

itu kalo di mac udah keinstall brew ya, kalo belum silahkan cari info instalasi brew di mac

Untuk penggunaanya lebih gampang lagi 🙂

nikto -host alamatserver

Nah ini menariknya, kita compare ya sama web server yang udah diamankan sama belum

ini yang belum diamankan

detanto@detantos-mbp ~ % nikto -host IpAtauNamaServeryangmaudicek
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          IpServeryangmaudicek
+ Target Hostname:    HostnameServeryangmaudicek
+ Target Port:        80
+ Start Time:         2020-05-02 00:51:30 (GMT7)
---------------------------------------------------------------------------
+ Server: Apache/2.4.18 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Server leaks inodes via ETags, header found with file /resources/img/ico/favicon.ico, fields: 0x47e 0x5817bef6860b4 
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ OSVDB-3092: /img/: This might be interesting...
+ OSVDB-3092: /login/: This might be interesting...
+ OSVDB-3268: /temp/: Directory indexing found.
+ OSVDB-3092: /temp/: This might be interesting...
+ OSVDB-3268: /database/: Directory indexing found.
+ OSVDB-3093: /database/: Databases? Really??
+ OSVDB-4231: /9MsD6.xml: Coccoon from Apache-XML project reveals file system path in error messages.
+ OSVDB-18114: /reports/rwservlet?server=repserv+report=/tmp/hacker.rdf+destype=cache+desformat=PDF:  Oracle Reports rwservlet report Variable Arbitrary Report Executable Execution
+ OSVDB-3233: /icons/README: Apache default file found.
+ OSVDB-3268: /md/: Directory indexing found.
+ OSVDB-3092: /md/: This might be interesting... potential country code (Republic Of Moldova)
+ OSVDB-3092: /license.txt: License file found may identify site software.
+ OSVDB-3092: /.svn/entries: Subversion Entries file may contain directory listing information.
+ OSVDB-3092: /.svn/wc.db: Subversion SQLite DB file may contain directory listing information. See http://pen-testing.sans.org/blog/pen-testing/2012/12/06/all-your-svn-are-belong-to-us
+ 7566 requests: 1 error(s) and 19 item(s) reported on remote host
+ End Time:           2020-05-02 01:15:27 (GMT7) (1437 seconds)
------------------------------------------------------------------

Ngeri nggak? dengan tools sederhana, server yang belum diamankan ini bisa terekploitasi informasinya sampe sedetail itu.

Nah sekarang ke server yang udah diamankan

detanto@detantos-mbp ~ % nikto -host IpAtauNamaServeryangmaudicek
- Nikto v2.1.6
---------------------------------------------------------------------------
+ No web server found on IpAtauNamaServeryangmaudicek:80
---------------------------------------------------------------------------
+ 0 host(s) tested

Beda kan? Sebetulnya banyak option yang ada di Nikto ini, kapan2 ta bahas

Jadi, gimana dengan servermu? udah secure ato belum? coba deh cek pake tools itu 🙂

Securing Centos

Setelah mencoba bbrp distro, lg mau nyobain centos buat server. Kerennya si centos ini compare to ubuntu menurut aku adalah lebih secure by default. Linux digadang2 sebagai OS yang aman, tapi kalau by default atau istilahnya abis install langsung aman sepengalamanku ya si Centos ini, krn SELinuxnya lgsg keinstall (CMIIW). SELinux adalah Security-Enhanced Linux.

Kenapa tadi dibilang ubuntu by default ga secure? Salah satunya yg ngeganjel ya : kalo ubuntu misal nih abis instalasi, user yang dibuat otomatis jadi sudoers, kalo si Centos sama Debian kaga, SELinuxnya atau semacamnya ndak ada, iptables ga aktif dsb. Malah kalau ngga salah di Debian sudoers itu nggak by default, tapi harus install dulu. Lha Centos ini abis install SELinuxnya udah ada, firewall lgsg aktif dan user yang dibuat belum masuk sudoers.  

Tapi ya gitu, keamanan tidak berbanding lurus dengan kenyaman, kalau SELinux kita aktifkan, itu juga jadi keribetan sendiri, karena apachenya musti disetting2 ga karuan.

Di artikel ini akan dibahas cara2 mengamankan tapi mengakibatkan ketidaknyamanan pas setting servernya. Instal2 beberapa ga ta bahas ya.

Tambah sudoers :

seperti di linux lainnya, untuk ubah sudoers, harus install sudo, editnya pake visudo. Untuk nambah sudoers ada 2 pendekatan; usernya ditambahkan ke group wheel atau langsung sejajar dengan root. IMHO mendingan ditambahkan ke wheel aja, kecuali kepepet :). caranya :

masuk ke root 

su -
usermod -aG wheel namauser

Kalau lgsg bikin sejajar ya tinggal jalanin visudo dan copas otorisasi root, kemudian ganti root jadi user yang mau jadi sudoers. Sebetulnya sudo ini banyak settingnya, jadi tiap user yang dijadiin sudoers ini bisa diatur lagi privilegesnya, tapi ntar bahasan lain aja.

Securing SSH 

ada 3 yang pasti ta ubah kalo setting server :

  1. root kaga boleh login
  2. ubah port ssh (standar 22, diubah terserah ke berapa)
  3. Menentukan user yang boleh melakukan ssh ke server

Ubah konfigurasi di /etc/ssh/sshd_config

Port 22 ke Port 2202 (atau terserah)
PermitRootLogin yes diubah ke no

AllowUsers namauser1 namauser2 dst

Kalau SELinuxnya nyala, konfigurasi di atas ini masi kurang, akan dibahas dibawah yang berhubungan sama SELinux

Firewall

secara default firewall di centos lgsg aktif dan kalo ga salah ngeblok semua. Untuk periksa status firewall, pake perintah

systemctl status firewalld

Ntar akan keluar statusnya

[detanto@namaserver ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-04-30 21:57:00 WIB; 5min ago
     Docs: man:firewalld(1)
 Main PID: 15906 (firewalld)
    Tasks: 2 (limit: 26213)
   Memory: 23.7M
   CGroup: /system.slice/firewalld.service
           └─15906 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

Apr 30 21:57:00 namaserver systemd[1]: Stopped firewalld - dynamic firewall daemon.
Apr 30 21:57:00 namaserver systemd[1]: Starting firewalld - dynamic firewall daemon...
Apr 30 21:57:00 namaserver systemd[1]: Started firewalld - dynamic firewall daemon.

pas ngerubah port ssh yang diatas, jangan lupa allow port yang dipilih dengan perintah

firewall-cmd --add-port=portnya/tcp --permanent

trus restart firewallnya

systemctl restart firewalld

ini berlaku buat semua ya, bahkan port 80 tadi ditutup sama si firewall kampret ini

Install Apache

sudo yum install httpd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Start dan check

sudo systemctl start httpd
sudo systemctl status httpd

kalo jalan ntar muncul

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: active (running) since Thu 2020-04-30 21:55:48 WIB; 1h 2min ago
     Docs: man:httpd.service(8)
 Main PID: 9086 (httpd)
   Status: "Total requests: 17; Idle/Busy workers 100/0;Requests/sec: 0.00454; Bytes served/sec: 186 B/sec"
    Tasks: 278 (limit: 26213)
   Memory: 57.0M
   CGroup: /system.slice/httpd.service
           ├─ 9086 /usr/sbin/httpd -DFOREGROUND
           ├─ 9087 /usr/sbin/httpd -DFOREGROUND
           ├─ 9088 /usr/sbin/httpd -DFOREGROUND
           ├─ 9089 /usr/sbin/httpd -DFOREGROUND
           ├─ 9090 /usr/sbin/httpd -DFOREGROUND
           └─19291 /usr/sbin/httpd -DFOREGROUND

Apr 30 21:55:48 namaserver systemd[1]: Starting The Apache HTTP Server...
Apr 30 21:55:48 namaserver systemd[1]: Started The Apache HTTP Server.
Apr 30 21:55:48 namaserver httpd[9086]: Server configured, listening on: port 80

Setting Virtual Host

Buat folder sites-available dan sites-enabled di folder /etc/httpd (kalo di ubuntu apache2)

trus edit httpd.conf, tambahkan 

IncludeOptional sites-enabled/*.conf

buat file namavirtualhost.conf di folder sites-available, yang isinya standarlah buat virtualhost

<VirtualHost>
ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/namaapp"
    ServerName namaserver.detanto.net
    ServerAlias namaserver.detanto.net
    ErrorLog "logs/namaserver_error_log"
    CustomLog "logs/namaserver_access_log" common
<Directory "/var/www/namaapp/">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

buat link di folder sites-enabled

sudo ln -s /etc/httpd/sites-available/namaapp.conf /etc/httpd/sites-enabled/namaapp.conf

Securing Apache

Directory Browsing

nah untuk ini penting banget, karena kalo boleh pengunjung akan bisa melihat dalam folder aplikasi web kita, kek gini.

Untuk nge-disable directory browsing di aplikasi kita, hilangkan Option Indexes di konfigurasi sites-available, sehingga jadi kek gini

<VirtualHost>
ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/namaapp"
    ServerName namaserver.detanto.net
    ServerAlias namaserver.detanto.net
    ErrorLog "logs/namaserver_error_log"
    CustomLog "logs/namaserver_access_log" common
<Directory "/var/www/namaapp/">
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

ServerTokens Prod

Tambahkan opsi ini di httpd.conf, supaya gak keliatan versi OS Servernya, jadinya kek gini :

tapi tetep muncul web servernya pake apa, jadi harus dihilangkan semua

ServerSignature Off

Tambahkan opsi ini di httpd.conf, supaya ilang semua

TraceEnable Off

Kalo idup, pengunjung bisa nyolong informasi cookie web kita, karena boleh Cross Site Tracing

Sembunyiin Versi PHP

biar ga ketauan kita pake php versi berapa, bisa disetting di php.ini, untuk tau lokasi php.ini yang dipake

php -i | grep "Loaded Configuration File"

Kalo udah tau tinggal edit php.ini-nya, cari text expose_php, defaultnya on, dibikin off. Sebelum di offkan ntar kalo kita akses pake lynx (browser cli), hasilnya akan seperti ini

[root@namaserver ~]# lynx -head -mime_header http://alamatserver
HTTP/1.1 200 OK
Date: Sat, 02 May 2020 08:54:28 GMT
Server: Apache
X-Powered-By: PHP/7.3.17
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: ci_session=2gm6ee0hieona2vnkq58dj7k8o2np0hm; expires=Sat, 02-May-2020 10:54:28 GMT; Max-Age=7200; path=/; HttpOnly
Connection: close
Content-Type: text/html; charset=UTF-8

Setelah dioffkan, hasilnya akan kek gini, X-powerednya ilang

[root@namaserver ~]# lynx -head -mime_header http://alamatserver
HTTP/1.1 200 OK
Date: Sat, 02 May 2020 08:55:49 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: ci_session=4vb2vkcpdnj9u88d2d4d9509pses88f6; expires=Sat, 02-May-2020 10:55:50 GMT; Max-Age=7200; path=/; HttpOnly
Connection: close
Content-Type: text/html; charset=UTF-8

SELinux Permission untuk Apache

check SELinux keinstall ndak

[root@namaserver perawatan_app]# rpm -qa | grep selinux
libselinux-2.9-2.1.el8.x86_64
python3-libselinux-2.9-2.1.el8.x86_64
selinux-policy-3.14.3-20.el8.noarch
container-selinux-2.124.0-1.module_el8.1.0+298+41f9343a.noarch
selinux-policy-targeted-3.14.3-20.el8.noarch
libselinux-devel-2.9-2.1.el8.x86_64
libselinux-utils-2.9-2.1.el8.x86_64
rpm-plugin-selinux-4.14.2-26.el8_1.x86_64

Kalo keluar kek gitu, brarti SELinux udah keinstall, trus check dulu status SELinuxnya

[root@namaserver www]# sestatus
SELinux status:                 disabled

Kalau tulisannya kek yang diatas, berarti disabled ato nggak aktif. Kalo mau aktifin, edit konfigurasi SELinuxnya yang ada di /etc/selinux/config. setiap level ada keterangannya seperti tulisan dibawah ini

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - WModification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Tinggal kita set sesuai kebutuhan kita. Kalo udah kita idupin, trus reboot servernya. abis itu kalo kita ketik sestatus munculnya kek gini

[root@namaserver ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

Untuk testing, tak saranin permissive dulu, jadi ntar tetep bisa diakses cuman akan muncul log-nya, cara liat lognya di

cat /var/log/messages | grep "SELinux is preventing"

Ntar akan muncul lognya, tak kasi sebagian ya

May  1 20:55:57 namaserver platform-python[1976]: SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 1122.
*****  Plugin bind_ports (92.2 confidence) suggests   ************************
If you want to allow /usr/sbin/sshd to bind to network port 1122
Then you need to modify the port type.
Do
semanage port -a -t PORT_TYPE -p tcp 1122
where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.
*****  Plugin catchall_boolean (7.83 confidence) suggests   ******************
If you want to allow nis to enabled
Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.
Do
setsebool -P nis_enabled 1
*****  Plugin catchall (1.41 confidence) suggests   **************************
If you believe that sshd should be allowed name_bind access on the port 1122 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
ausearch -c 'sshd' --raw | audit2allow -M my-sshd
semodule -X 300 -i my-sshd.pp

Karena port ssh tadi diubah, makanya muncul log ini, jadi kita musti jalanin

semanage port -a -t ssh_port_t -p tcp 1122
setsebool -P nis_enabled 1
ausearch -c 'sshd' --raw | audit2allow -M my-sshd
semodule -X 300 -i my-sshd.pp

Jadi kalau permissive, dikasi tau semua tuh stepnya. Misal nih kita mau liat yang web, kita akses dulu webnya, trus kita liat lognya lag, akan muncul hasilnya kek gini:

May  1 22:18:58 namaserver setroubleshoot[20155]: SELinux is preventing /usr/sbin/php-fpm from name_connect access on the tcp_socket port 389. For complete SELinux messages run: sealert -l f26d0490-06e1-4932-8c5b-78df5f0aa9b0
May  1 22:18:58 namaserver platform-python[20155]: SELinux is preventing /usr/sbin/php-fpm from name_connect access on the tcp_socket port 389.
*****  Plugin catchall_boolean (24.7 confidence) suggests   ******************

If you want to allow httpd to can network connect
Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.

Do
setsebool -P httpd_can_network_connect 1

*****  Plugin catchall_boolean (24.7 confidence) suggests   ******************

If you want to allow httpd to can connect ldap
Then you must tell SELinux about this by enabling the 'httpd_can_connect_ldap' boolean.

Do
setsebool -P httpd_can_connect_ldap 1

*****  Plugin catchall_boolean (24.7 confidence) suggests   ******************

If you want to allow authlogin to nsswitch use ldap
Then you must tell SELinux about this by enabling the 'authlogin_nsswitch_use_ldap' boolean.

Do
setsebool -P authlogin_nsswitch_use_ldap 1

*****  Plugin catchall_boolean (24.7 confidence) suggests   ******************

If you want to allow nis to enabled
Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.

Do
setsebool -P nis_enabled 1

*****  Plugin catchall (3.53 confidence) suggests   **************************

If you believe that php-fpm should be allowed name_connect access on the port 389 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'php-fpm' --raw | audit2allow -M my-phpfpm
# semodule -X 300 -i my-phpfpm.pp

Jadi setting SELinuxnya musti dibenerin satu2. mati ga lo? kita musti liat daftar policy yang berhubungan sama urusan web, caranya :

[root@perawatan perawatan_app]# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off httpd_can_network_memcache --> off httpd_can_network_relay --> off httpd_can_sendmail --> off httpd_dbus_avahi --> off httpd_dbus_sssd --> off httpd_dontaudit_search_dirs --> off httpd_enable_cgi --> on httpd_enable_ftp_server --> off httpd_enable_homedirs --> off httpd_execmem --> off httpd_graceful_shutdown --> off httpd_manage_ipa --> off httpd_mod_auth_ntlm_winbind --> off httpd_mod_auth_pam --> off httpd_read_user_content --> off httpd_run_ipa --> off httpd_run_preupgrade --> off httpd_run_stickshift --> off httpd_serve_cobbler_files --> off httpd_setrlimit --> off httpd_ssi_exec --> off httpd_sys_script_anon_write --> off httpd_tmp_exec --> off httpd_tty_comm --> off httpd_unified --> on httpd_use_cifs --> off httpd_use_fusefs --> off httpd_use_gpg --> off httpd_use_nfs --> off httpd_use_openstack --> off httpd_use_sasl --> off httpd_verify_dns --> off

Sesuai dengan yang di log tadi, beberapa harus kita buka; yaitu

setsebool -P httpd_can_connect_ldap 1
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1
setsebool -P authlogin_nsswitch_use_ldap 1
setsebool -P nis_enabled 1

Habis itu kita liat log lagi, kalo udah bener settingnya, harusnya ga akan muncul lg di /var/log/messages

setelah yakin baru kita set SELinuxnya enforcing bukan permissive lagi, trus reboot. selesai dah

Masi ada materi lain si, ntar ta bahas lagi

semoga bisa membantu yg lg setting Centos ato yang lain, Thx!

Install Koneksi PHP untuk MS SQL Server di CENTOS 8

Sebetulnya untuk instalasi sqlsrv bisa dilihat di webnya microsoft tapi gak papa, tak tambahin disini aja buat catatan

Install ODBC Driver

ini buat centos 8 ya, dan ambilnya dari rhel8
curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repo

exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo ACCEPT_EULA=Y yum install msodbcsql17

# cuman buat koneksi via CLI

sudo ACCEPT_EULA=Y yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

sudo yum install unixODBC-devel

Install prequsites sebelum install sqlsrv

dnf install php-xml php-pdo php-pear php-devel

Di gw muncul error pada saat install php-devel padahal sebelumnya di Centos 7 kaga. Jadi kalao install di Centos 8 harus jalankan perintah ini dulu:

dnf config-manager --set-enabled PowerTools

baru jalankan yum install php-devel. dan kebetulan error ahahhahaha, ternyata diblock outbound 80 dari servernya, ta matiin dulu firewallnya, males bikin commandnya

systemctl stop firewalld

Install sqlsrv

pecl install sqlsrv
pecl install pdo_sqlsrv

kondisi firewall dan SELinux mati ya, kalau idup ya musti disetting dulu koneksinya yg dibolehkan

setelah selesai, bikin koneksi sederhana pake php trus jalankan

$hostname = 'namaserver'; 
$username = 'namauser'; 
$password = 'katasandi'; 
$database = 'namadatabase'; 

$serverName = $hostname; 

$connectionOptions = array(
    "database" => $database,
    "uid" => $username,
    "pwd" => $password
);

// Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
    die(formatErrors(sqlsrv_errors()));
}

// Select Query
$tsql = "SELECT @@Version AS SQL_VERSION";

// Executes the query
$stmt = sqlsrv_query($conn, $tsql);

// Error handling
if ($stmt === false) {
    die(formatErrors(sqlsrv_errors()));
}

dannnn ga jalan, muter2 mulu. Bingunglah gw, gw cobain koneksi pake cli dengan command :

sqlcmd -S namaserver -U namauser -P password -d namadatabase -Q "select * from tablenya" 

dan hasilnya tetep ga bisa

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol].
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.

Untungnya, kalo di CLI jelas terpampang errornya, tadi sempet gw state; ga jalan muter2 mulu. itu masih mending. kalau di Codeigniter, dia ga bisa return object hasil query! kan bangke, kaga muncul error detailnya, cuman muncul :

Message: Call to a member function num_rows() on bool

kampret bener, gugling sampe bego jawabannya macem2: salah querylah, tablenya ga ada lah, dan jawaban2 lain yang tidak menyelesaikan!

Dari error di cli, gw ambil kesimpulan konfigurasi SQL Servernya yang dodol, dia masih pake TLS1.0 (untung pernah dibahas di docker, jadi bisa memperkirakan errornya dan ngerti keywordnya apa. coba kalo belum juga pusing itu).

Nah kalo ubuntu gampang, konfigurasi adanya di /etc/ssl/openssl.conf, di Centos ini bangke banget! di folder /etc/ssl isinya cuman link ke folder /etc/pki/certs kalo ga salah dan konfigurasi openssl ada di folder /etc/pki/tls. Sialnya isi konfigurasi beda sama yang di ubuntu. kupret banget!

Akhirnya brosang brosing kesana kemari, nemu web bahasa jepang yang gw juga ngeraba artinya. Jadi di Centos 8 ini secara default crypto-policiesnya make yang baru (kemungkinan TLS2.0). Di dalam folder /etc/crypto-policies ada file config (jangan nanya nemunya gimana, gw juga lupa), di file itu ada statement gini:

* LEGACY: Ensures maximum compatibility with legacy systems (64-bit security)
* DEFAULT: A reasonable default for today's standards (112-bit security).

tuh kan bener! dia pake today standards, sementara SQL Server disana koneksi sslnya jadul. Akhirnya gw edit file config di dalam /etc/crypto-policies, dari value awal DEFAULT gw ubah ke LEGACY. kemudian jalankan command

[root@namaserver ~]# update-crypto-policies
Setting system policy to LEGACY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.

Restart dan langsung berhasil koneksinya ke SQL Server!!

Semoga bisa membantu yang kesulitan kek gw tadi, terima kasih

Lupa Password PostgreSQL

untuk merubah, kita harus edit file pg_hba.conf, kita ubah

host all all 127.0.0.1/32 md5

dari md5 ke trust, sehingga menjadi

host all all 127.0.0.1/32 trust

kemudian kita restart servicenya

/etc/init.d/postgresql restart

Kemudian masuk ke console postgre dengan terlebih dahulu masuk sebagai user postgres

su - postgres

kemudian konek ke databasenya

psql -h localhost -U postgres

dan kemudian ubah passwordnya

ALTER USER postgres PASSWORD 'pwdbaru';

setelah selesai, akan muncul konfirmasi

ALTER ROLE

Setelah itu, ubah lagi pg_hba.conf menjadi md5 dan restart service postgrenya. done!

Install PostgreSQL 11, PostGIS di Debian

PostgreSQL

Sebetulnya, kalau instalasi postgreSQL maupun PostGIS di docker sederhana, tinggal pull dari hub.docker.com. Disana ada resource yg lengkap, baik buat postgresql (dari official) ataupun postgis (bisa dari kartoza atau lainnya). Kebetulan gw butuh webserver php yang nantinya akan menjalankan command dari postgis, makanya terpaksa install manual di dockernya. Mungkin ini salah, tapi gw nyari yang cepet aja 🙂

sudo apt install -y vim wget
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

Kemudian tambah releasenya

RELEASE=$(lsb_release -cs)
echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee  /etc/apt/sources.list.d/pgdg.list

Trus biasalah, pake apt command

sudo apt update
sudo apt -y install postgresql-11

Nah, secara default persis seperti database2 lainnya, postgresql ini kaga bisa dikonek dari luar; cuman bisa dari dalem (localhost/127.0.0.1). Untuk supaya bisa diakses dari luar, kita harus edit 2 file :

pg_hba.conf
postgresql.conf

yang letaknya tergantung dari versi instalasi anda

/etc/postgresql/{versi}/main

di pg_hba.conf, cari yg IP4 local connection, dan tambahkan

host all all 0.0.0.0/0 md5

di postgresql.conf, cari listen_addresses dan ganti menjadi ‘*’

listen_addresses = '*'

jangan lupa ubah password postgres-nya, caranya : kita masuk ke system menggunakan user postgres

sudo - postgres

dan ubah passwordnya

postgres@867f1a4ef8c0:~$ psql -c "alter user postgres with password 'qqwwee'"

abaikan nilai setelah @ karena itu adalah nama container/image dari docker. akan muncul kata2, sebagai konfirmasi bahwa proses alter sudah berhasil

ALTER ROLE

dah gitu aja

PostGIS

exit user postgres, kemudian kita install postGIS, untuk baca data spasial

apt install postgis postgresql-11-postgis-2.5

*untuk postgresql 11, pakenya postgis 2.5, untuk 12 pakenya postgis 3

kemudian masuk lagi ke system menggunakan user postgres seperti cara diatas, dan kita buat user dan database GIS yang akan dipake.

postgres@867f1a4ef8c0:~$ createuser testgis
postgres@867f1a4ef8c0:~$ createdb gisdb -O testgis

Konek ke database dengan mencantumkan nama database yang akan kita pasang extension postgisnya

psql -d gisdb
psql (11.6 (Debian 11.6-1.pgdg100+1))
Type "help" for help.
gisdb=#

Kemudian kita enable postgis extension di database tersebut

gisdb=# CREATE EXTENSION postgis;
CREATE EXTENSION

Untuk memeriksa sukses tidaknya, jalankan perintah:

gisdb=# select postgis_version();
postgis_version
---------------------------------------
2.5 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
gisdb=#

udah gitu aja, simple kan? untuk testingnya bisa pake QGIS atau software lainnya

HDD External tidak terbaca di Mac

Beberapa kali kejadian, hdd external diunplugged tapi ngga proper, entah kabel yg udah buluk, usb c hubku yang dodol ato lupa belum dieject. Hal ini jadi masalah kalo di mac, khususnya buat gw. dulu bbrp kali minta bantuan imran buat konekin ke windowsnya dia trus di chkdsk namadrive /f. dengan command itu, hdd external akan bisa terbaca di mac. Tapi ya masa musti tergantung sama windows?
enggalah, mac ada caranya sendiri, meskipun ga segampang windows.

Pertama, tancepin hdd external ke mac, kemudian jalanin

diskutil list

ntar akan muncul nama drive yang terhubung

Screen Shot 2019-11-17 at 03.45.21

trus paksa eject

diskutil eject /dev/disk2

Pada beberapa kesempatan, eject ini gagal. nah kita musti periksa ada proses yg make dengan command :

ps ax | grep fsck

Ntar akan muncul :
Screen Shot 2019-11-17 at 03.48.02

langsung bantai aja proses ini dengan pid yang disebut

kill -9 3795

Akan muncul pesan bahwa hdd bisa dimount tapi tidak bisa digunakan untuk melakukan modifikasi data di hdd. biarin aja 🙂

Kemudian jalankan disk utility, pilih hdd externalnya, trus klik first aid.

 

Screen Shot 2019-11-17 at 03.44.04

Tunggu dengan sabar sampai selesai (tergantung besar hdd-nya). kemudian mount ulang hddnya. Done!

Docker PHP tidak bisa konek SQL Server

Ini sebetulnya masalah kompatibilitas dari SQL Server terhadap TLS versi 1.2, dan di web2 dianjurkan untuk upgrade. Tapi karena SQL Servernya bukan punyaku, jadi yang ngalah ya harus dockernya. Caranya tinggal masuk ke dockernya


docker exec -ti namacontainer bash

Kemudian ubah konfigurasi sslnya yang ada di

/etc/ssl/openssl.cnf

Cari

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

Kemudian ubah angka 2 ke 0

[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1

Restart apache, pasti lgsg bisa connect sql server 🙂

Error Subversion : Could not use external editor to fetch log message

Error diatas muncul pada saat mau commit di mac gw dari terminal.

svn: E205007: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the –message (-m) or –file (-F) options
svn: E205007: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no ‘editor-cmd’ run-time configuration option was found

Solusinya adalah dengan masuk ke terminal trus ketik :

export SVN_EDITOR=vi

dah gitu aja

Docker


Apa itu Docker?

Docker kalo menurut gw semacam virtualisasi kek virtualbox, dkk hanya saja kalo docker itu semuanya ada di dalam container dimana container2 tersebut bisa saling berkomunikasi. Berbeda dengan virtualisasi, container2 bisa jalan tanpa kita install guest OS (karena biasanya udah built-in). Jadi sebenernya docker itu menurut gw adalah Container Manager bukan Virtual Machine (VM) Manager. Meskipun container ini pada akhirnya bisa kita perlakukan seperti VM, misalnya kita bisa akses shellnya, install package yang belum ada dan sebagainya, tapi lebih tepat kalo disebut container manager deh. Sebaca gw, docker mengadopsi fitur sandbox, sehingga tiap container terisolasi satu sama lain. Hal ini bisa menjamin aplikasinya dapat jalan tanpa gangguan dari environment host-nya.

Positifnya docker ini, kita bisa punya beberapa container dengan isi yg berbeda2 tanpa harus punya OS di masing2 container tersebut, misalnya kita mau deploy php71, php72 php56 dan lain sebagainya kita bisa pasang di container yg berbeda beda sehingga ga mengganggu satu sama lain.

Dan gw install docker dengan tujuan satu: simple installation. Misal komputer kita crash (amit2) dan semua aplikasi kita ada disitu sementara client udah terburu2 deploy aplikasi; apa ga panik itu? musti install ini-itu belum lagi kalo error macem2 wahhahahaha. Nah kalo pake docker kita tinggal unduh imagenya dari repo mereka dan langsung jalan. ini udah gw terapin di instalasi mac gw, bener2 clean install dan cuman pake docker. gw install php72, mysql, postgresql, nodejs, mapnik dan kawan2. dan gw tinggal pull dari image di docker hub setelah proses pull selesai, lgsg jalan. Kalau dari temen2 full-stack developer, mereka bilang keunggulan docker ini adalah kita bisa menciptakan environment sendiri dan pada saat deploy di production kita juga bisa menciptakan environment yang sama. What? docker di production? yeah anda ga salah baca, sekarang banyak yg deploy docker di production dan jalan bagus. Keunggulan deployment ini penjelasannya kek gini :

server

Misal kita buat aplikasi untuk client, kan pada saat deploy kita akan menaruh aplikasi kita ke server dengan environment yang kita butuhkan. Environment pasti kan Server dan Operating System, mau linux kek, windows kek, mac kek terserah. dan misal aplikasi kita berbasis web dan pake database, pasti butuh web server dan database server. Masalahnya adalah, environment di local development kita sama server pasti berbeda, misal kek gw, develop di mac, deploy mostly di linux. Linux sendiri juga beda2, ada centos, debian, ubuntu, dll.

Nah deployment dengan Docker (kalo kita mau pake docker ya) akan berbeda. kita akan mendeploy aplikasi kita utuh barengan sama web server dan database servernya dalam format docker container (term container ini gw jelasin ntar) dan di server ga perlu install web server dan database server. Gambarnya kek gini :

aplikasi.png

Dan kerennya aplikasi dalam bentuk container ini akan terisolasi dari operating system server. Apapun OS-nya kalo kita udah install docker di server, maka container dari kita yang akan diakses oleh user aplikasi.


Komponen Docker


Images

Docker images adalah sebuah template yang bersifat read only. Sepengalaman gw template image ini sebetulnya ber-OS (biasanya debian atau tergantung imagenya), tapi dengan pilihan sesuai kebutuhan kita; misal kita butuh image php72, ya image ini berisi OS Debian dan sudah berisi php72. Nah image ini tersedia di hub.docker.com, ente tinggal kesana dan pilih image mana yang mau di download (pull). Karena gw banyak di php, gw crita yg berhubungan sama php ya; di hub.docker.com, ada banyak image php; akan lebih baik kalo pilih dari image yang disediakan sama officialnya, seperti gambar di bawah ini.

Jadi si image ini kita tinggal pilih mau dari OS apaan, setelah itu tinggal kita pilih imagenya, cari aja link yang bilang official image

Dari images ini, kita bisa buat container dimana dengan hanya 1 docker images kita dapat membuat banyak docker container.

Container

Container itu adalah instance dari image yang bisa dijalankan. Anda bisa membuat, menjalankan atau menghapus container docker tapi image tetap ada. Intinya kita akan akses aplikasi itu dari docker berdasarkan image yang udah kita pull. Dari container ini bisa diakses dari mana aja selama kita buka portnya dan kaga bentrok sama port yang udah jalan.

Volumes

By default, volume ini tidak perlu distate pada waktu kita bikin container, tetapi dari yg gw baca, dengan kita mount volume kita akan mudah untuk melakukan modifikasi terhadap file-file yang dinamis, misalnya : edit konfigurasi php.ini maupun edit aplikasi kita tanpa perlu akses ke dalam container tersebut. Bingung ya? harus praktek sih biar ga bingung aheuhaueh, ntar abis teori gw kasi gambarannya kek mana biar paham.


Gimana cara install Docker?


gampang kok, tinggal donlod installer desktopnya dari http://www.docker.com. kalo di mac tinggal next2 doang, trus ntar kalo instalasinya berhasil akan muncul icon ikan paus di toolbar atas

kalo kita klik, ntar keluar informasi lengkapnya

Preferences cuman opsional biasanya, bisa juga disitu kalo kita mau restore semuanya ke awal, atau uninstall docker. Untuk pengguna Mac akan lebih baik kalo mau uninstall docker liwat sini, karena kalau liwat fitur ini semuanya akan dibantai, termasuk image dan container. Seperti kita tau, kalo mau uninstall di mac kan tinggal drag applicationnya ke trash bin, sebetulnya ini juga bisa cuman ntar image2nya ketinggalan.

Instalasi kelar, trus ngapain?

First thing first, install Kitematic, ini ngebantu banget untuk manajemen Dockernya; gugling aja kitematic docker, ntar akan muncul link downloadnya. gw ga tau ada ga di windows tapi di mac pasti ada. Interfacenya ntar kek gini :

Screen Shot 2019-10-01 at 11.43.36.png

disitu akan tampil container yang pernah kita buat di sebelah kiri dan image2 yang tersedia di docker.hub. Kalau kita mau install image, tinggal search image yang kita butuh dan pilih create, ntar akan keinstall di dockermu. Untuk container yang udah kita buat, kalau kita klik akan muncul status dari container tersebut; bisa kita stop, restart, exec (ini masuk ke shellnya) atau liat dokumentasinya, kek gambar dibawah ini.

Screen Shot 2019-10-01 at 11.42.41

Trus ngapain lagi?

Ya kita buat container yang kita butuhkanlah, ntar gw bikin lagi tulisannya ya. akan ada penjelasan gimana build container, pull image, pake Dockerfile atau menggunakan docker-compose dsb dsb. Dan ga lupa command-command CLI dari docker. Okeh semoga membantu!