Upgrade Nginx 1.18 to Nginx 1.26 (Official Nginx Repository)

To upgrade Nginx 1.18 to Nginx 1.26 on Ubuntu 22.04 (Jammy Jellyfish), you need to install it from the official Nginx repository instead of the default Ubuntu repository (which contains outdated versions). Here’s the step-by-step guide:


Step 1: Remove Old Nginx Version

First, check your current installed Nginx version:

nginx -v

If it’s 1.18, remove it to prevent conflicts:

sudo apt remove nginx nginx-core nginx-common -y
sudo apt autoremove -y

Step 2: Add the Official Nginx Repository

Since the Ubuntu repository only provides older versions, add the official Nginx repository.

  1. Import the Nginx GPG key:
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
  1. Add the official Nginx repository:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Step 3: Update Package List and Install Latest Nginx

sudo apt update
sudo apt install nginx -y

Step 4: Verify Nginx Installation

Check the installed version:

nginx -v

It should now show 1.27.0 or the latest stable version.


Step 5: Restart and Enable Nginx

sudo systemctl restart nginx
sudo systemctl enable nginx

(Optional) Step 6: Verify Nginx is Running

Check if Nginx is running:

sudo systemctl status nginx

Check if it’s listening on port 80:

sudo ss -tulnp | grep nginx

Done !

But if You saw some thing like

W: GPG error: http://nginx.org/packages/ubuntu jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ABF5BD827BD9BF62

It looks like the GPG key for the official Nginx repository is missing or not properly added. Let’s fix this step-by-step.


Step 1: Remove the Old Key (If Exists)

sudo rm -f /usr/share/keyrings/nginx-archive-keyring.gpg

Step 2: Import the Correct GPG Key

Now, add the correct Nginx GPG key:

curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null

Verify that the key has been added:

gpg --show-keys /usr/share/keyrings/nginx-archive-keyring.gpg

It should display something like:

pub   rsa4096 2011-08-19 [SC]
      ABF5 BD82 7BD9 BF62

Step 3: Correct the Nginx Repository Configuration

Now, re-add the Nginx repository, ensuring it references the signed key correctly:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Step 4: Update and Install Nginx

Try updating your package list again:

sudo apt update

If no errors appear, proceed with installing Nginx:

sudo apt install nginx -y

Step 5: Verify the Installation

Check the installed Nginx version:

nginx -v

If it shows 1.27, the upgrade was successful. πŸŽ‰


Troubleshooting

If you still get a NO_PUBKEY error, try manually adding the key:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62

Then update again:

sudo apt update

That should fix the issue.

Seputar Reverse Proxy #1

Case #1: Header Host

Misalkan Anda memiliki server Nginx yang bertindak sebagai reverse proxy untuk server backend yang menjalankan aplikasi web di http://localhost:8080. Konfigurasi Nginx Anda mungkin terlihat seperti ini:

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host; 
  }
}

Dalam hal ini, ketika klien meminta http://example.com, Nginx akan meneruskan permintaan ke http://localhost:8080, tetapi akan mengatur header Host dalam permintaan yang diteruskan ke example.com . Ini memastikan bahwa aplikasi web di server backend menerima hostname yang benar.

proxy_set_header Host $host; adalah direktif penting dalam konfigurasi reverse proxy Nginx. Ini memastikan bahwa server backend menerima hostname asli yang diminta oleh klien, yang penting untuk banyak aplikasi web dan konfigurasi server.

Upgrade Nginx versi 1.18.0 ke versi terbaru dari Mainline (1.27.0) di Ubuntu 22.04

Saat tulisan ini dibuat, Nginx yang digunakan masih versi 1.18 yang menjadi default versi Nginx di Ubuntu 22.04, kenyataannya sudah dianggap obsolete oleh teman-teman web security karena sudah rentan dari faktor keamanan. Untuk itu sangat disarankan untuk mengupgrade nya ke versi yang lebih tinggi. Bagi yang hanya akan upgrade ke versi 1.26, silahkan lihat di sini

Apa yang membedakan antara versi stable dan mainline ?

  • Stable (v 1.26): Versi yang telah teruji dengan baik dengan lebih sedikit pembaruan, cocok untuk lingkungan produksi.
  • Mainline (v1.27): Pembaruan yang lebih sering dengan fitur-fitur baru, direkomendasikan bagi pengguna yang memerlukan peningkatan terkini.

Saran: Jika Anda menjalankan server produksi, disarankan untuk tetap menggunakan 1.26.2 (Stabil), bukan 1.27 (Utama).

Berikut adalah langkah-langkah upgrade nya menggunakan terminal/console

Pertama kali sebaiknya kita lakukan backup terhadap Nginx yang sekarang ada:

sudo cp -r /etc/nginx /etc/nginx.backup

Lakukan langkah-langkah berikut ini:

sudo apt update && sudo apt upgrade -y

Kita cabut atau hilangkan Nginx yang ada

sudo systemctl stop nginx
sudo apt-get autoremove nginx*

Kemudian tambahkan repository mainline NGinx

sudo add-apt-repository ppa:ondrej/nginx-mainline -y
sudo apt update
sudo apt install nginx-core nginx-common nginx nginx-full -y

Kita cek/periksa Nginx versi Mainline nya, perintah di bawah akan memunculkan versi terakhir yang tersedia di server:

apt-cache policy nginx

Enable/aktifkan layanan Nginx

systemctl status nginx
sudo systemctl start nginx
sudo systemctl enable nginx

Berikut posisi setelah upgrade:

Semoga berhasil !

Mengenal Plugin Block: Filtered course list

Saat tulisan ini dibuat block ini dapat digunakan pada Moodle versi 3.8 hingga versi 4.3

Plugin ini dapat ditemukan di: https://moodle.org/plugins/block_filtered_course_list

Blok Filtered course list menampilkan daftar course yang dapat dikonfigurasi. Hal ini dimaksudkan sebagai pengganti blok My Course, meskipun keduanya tetap dapat digunakan bersama-sama. Plugin ini dikelola oleh Collaborative Liberal Arts Moodle Project (CLAMP).

Administrator dapat menerapkan berbagai filter yang digunakan untuk mengatur daftar course di blok. Course dapat diurutkan berdasarkan:

  1. kategori,
  2. kecocokan nama pendek,
  3. atau status penyelesaian.
  4. Mendukung Pencocokan regex. Jika semua mata kuliah dalam suatu semester mempunyai nama pendek yang diakhiri dengan kode semester, misalnya, maka administrator dapat menetapkan mata kuliah tersebut untuk muncul di bawah “Mata kuliah saat ini”, “Mata kuliah mendatang” atau judul lainnya.

Administrator dapat menetapkan beberapa judul yang dapat diciutkan dan memilih judul mana, jika ada, yang harus diperluas secara default.

Pilihan lainnya mencakup kemampuan untuk menyembunyikan blokir dari tamu atau pengunjung anonim, untuk memilih apakah admin melihat semua kursus atau miliknya sendiri, dan untuk menyembunyikan atau menampilkan tautan ke pencarian kursus yang lebih komprehensif.

Pengamanan Situs dengan menggunakan headers pada server Nginx

Secure Nginx from Clickjacking with X-FRAME-OPTIONS

Clickjacking

https://owasp.org/www-community/attacks/Clickjacking

X-Frame Options

Header add_header X-Frame-Options “SAMEORIGIN”;

Reference: here

Header X-XSS-Protection

When this header is being sent along with a response and the website contains an XSS attack, the browser will see this XSS attack and stop it from loading. This protection knows 3 levels:

  • X-XSS-Protection: 0; Disables the filter entirely.
  • X-XSS-Protection: 1; Enables the filter but only sanitizes the malicious script
  • X-XSS-Protection: 1; mode=block Enables the filter and completely blocks the page

Example:

add_header X-XSS-Protection "1; mode=block";
atau
add_header X-XSS-Protection "1;";

Reference

https://youtu.be/pV_uX0jDAh4?si=W6gbBjvpvniVDSDB

X-XSS-Protection headers. Protection or vulnerability?

https://webdock.io/en/docs/how-guides/security-guides/how-to-configure-security-headers-in-nginx-and-apache

Resize Guest Disk Virtual Machine

Ringkasan langkah:

  1. Pastikan lokasi disk image yang akan diperbesar kapasitasnya
  2. Tentukan cara yang akan digunakan untuk memperbesar VM nya
    • Lihat informasi partisi pada disk image,
  3. Rename disk image lama, buat Disk image baru dengan ukuran yang diinginkan
  4. Buat disk baru
  5. Jalankan perintah virt-resize

1. Informasi tentang disk image

# virsh dumpxml <GuestName>

contoh:

# virsh dumpxml Digitos_U22_5
<domain type='kvm'>
  <name>Digitos_U22_5</name>
  <uuid>0d737f69-3200-440f-8117-8506bacde339</uuid>
  <metadata xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0" xmlns:cockpit_machines="https://github.com/cockpit-project/cockpit-machines">
    <libosinfo:libosinfo>
      <libosinfo:os id="http://ubuntu.com/ubuntu/22.04"/>
    </libosinfo:libosinfo>
    <cockpit_machines:data>
      <cockpit_machines:has_install_phase>false</cockpit_machines:has_install_phase>
      <cockpit_machines:install_source_type>file</cockpit_machines:install_source_type>
      <cockpit_machines:install_source>/server_images/ubuntu-22.04.3-live-server-amd64.iso</cockpit_machines:install_source>
      <cockpit_machines:os_variant>ubuntu22.04</cockpit_machines:os_variant>
    </cockpit_machines:data>
  </metadata>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-rhel8.6.0'>hvm</type>
  </os>
  <features>
    <acpi/>
    <apic/>
    <vmport state='off'/>
  </features>
  <cpu mode='host-model' check='partial'/>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native'/>
      <source dev='/dev/vmdiskpool/vmdisk5'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
...

Terlihat bahwa disk image ada di : /dev/vmdiskpool/vmdisk5

2. Lihat informasi partisi pada disk image

# virt-df -h

Misalnya :

# virt-df -h -a /dev/vmdiskpool/vmdisk5 
Filesystem                                Size       Used  Available  Use%
vmdisk5-100g:/dev/sda2                    1.7G       130M       1.5G    8%
vmdisk5-100g:/dev/ubuntu-vg/ubuntu-lv
                                          8.0G       4.2G       3.4G   53%

3. Rename disk image

lvrename /dev/vmdiskpool/vmdisk5 /dev/vmdiskpool/vmdisk5.backup

4. Buat Disk baru

# lvcreate -L <new-size>G -n <nama-disk> <disk-pool>/dev/vg_guests

contoh:

# lvcreate -L 100G -n vmdisk5 /dev/vmdiskpool

5. Resize partisi (optional) dan salin partisi lama ke disk image baru

Bagi yang belum terinstall virt-resize, untuk pengguna Ubuntu, Debian dapat memasangnya sbb:

# apt-get install libguestfs-tools

Berikut penggunaannya:

# virt-resize /dev/vmdiskpool/vmdisk5-backup /dev/vmdiskpool/vmdisk5 --resize /dev/sda2=1.8G  --expand /dev/sda3 --LV-expand /dev/ubuntu-vg/ubuntu-lv

Output nya kira-kira akan seperti ini:

[   0.0] Examining /dev/vmdiskpool/vmdisk5-backup
**********

Summary of changes:

/dev/sda1: This partition will be left alone.

/dev/sda2: This partition will be resized from 1.8G to 1.8G.  The 
filesystem ext4 on /dev/sda2 will be expanded using the β€˜resize2fs’ 
method.

/dev/sda3: This partition will be resized from 8.2G to 98.2G.  The LVM PV 
on /dev/sda3 will be expanded using the β€˜pvresize’ method.

/dev/ubuntu-vg/ubuntu-lv: This logical volume will be expanded to maximum 
size.  The filesystem ext4 on /dev/ubuntu-vg/ubuntu-lv will be expanded 
using the β€˜resize2fs’ method.

**********
[   3.7] Setting up initial partition table on /dev/vmdiskpool/vmdisk5
[  14.9] Copying /dev/sda1
[  14.9] Copying /dev/sda2
 100% βŸ¦β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’βŸ§ 00:00
[  18.7] Copying /dev/sda3
 100% βŸ¦β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’β–’βŸ§ 00:00
[  46.2] Expanding /dev/sda2 using the β€˜resize2fs’ method
[  46.3] Expanding /dev/sda3 using the β€˜pvresize’ method
[  46.3] Expanding /dev/ubuntu-vg/ubuntu-lv using the β€˜resize2fs’ method

Resize operation completed with no errors.  Before deleting the old disk, 
carefully check that the resized disk boots and works correctly.

Reference:

mysqldump in practice

Default

Kasus #1

# mysqldump --no-create-info --complete-insert --insert-ignore pintar_db > pintar_db-20230824-2208.insert-ignore.data

File backup yang dihasilkan:

  1. tidak memuat perintah CREATE [table β€œβ€ not found /]
  2. kalau ada data yang akan di insert, ternyata sudah ada, maka proses insert record data terkait akan di lewatkan
  3. complete-insert …

Kasus #2 – replace

mysqldump --no-create-info --replace pintar_db > pintar_db-20230827-1554.replace.data

File backup yang dihasilkan:

  1. tidak memuat perintah CREATE [table β€œβ€ not found /]
  2. kalau ada data yang akan di insert, ternyata sudah ada, maka data tersebut akan direplace oleh data yang baru datang

Kasus #3 – dump table tertentu

Jika Anda akan dumping tabel-tabelΒ t1,Β t2, danΒ t3Β dari mydb:

mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql

Sebaliknya, Jika Anda akan dumping semua tabel kecuali tabel-tabelΒ t1,Β t2, danΒ t3Β dari mydb:

DBTODUMP=mydb
SQL="SET group_concat_max_len = 10240;"
SQL="${SQL} SELECT GROUP_CONCAT(table_name separator ' ')"
SQL="${SQL} FROM information_schema.tables WHERE table_schema='${DBTODUMP}'"
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
TBLIST=`mysql -u... -p... -AN -e"${SQL}"`
mysqldump -u... -p... ${DBTODUMP} ${TBLIST} > mydb_tables.sql

Note: Anda dapat mengubah SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')" to SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Anda juga dapat mengganti kondisi menjadi ‘%foo%’ untuk mendapatkan semua table yang menggandung kosa-kata ‘foo’ dalam nama tabelnya (termasuk didalamnya seperti: ‘food’, ‘fool’, dst).

Kasus #4 – ignore table(s)

Cara lain jika Anda akan dumping semua tabel kecuali tabel-tabelΒ t1,Β t2, danΒ t3Β dari mydb:

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.t1    \
  --ignore-table=schema.t2    \
  --ignore-table=schema.t3 > mysqldump.sql

File backup yang dihasilkan:

  1. Semua table di dump tapi tidak akan dumping table t1,t2 dan t3

References:

  1. https://man7.org/linux/man-pages/man1/mysqldump.1.html
  2. https://dba.stackexchange.com/questions/9306/how-do-you-mysqldump-specific-tables

User dan Role di Postgresql

Pengertian role di postgresql

Roles ini berbeda dengan pengertian roleΒ  di sistem operasi Unix. Disini tidak ada pembedaan antara users dan groups. Roles dapat diubah-ubah, dan lebih flexible. Misalnya role dapat menjadi anggota dari role yang lain. Role juga dapat memiliki objek dan access control terhadap object2 tersebut. Secara default setiap user memiliki role sendiri.

Melihat user yang sudah ada :

postgres=# SELECT rolname FROM pg_roles;
 rolname  
----------
 postgres
(1 row)

Sebuah roleΒ adalah entitas yang dapat memiliki objek database, dan memiliki wewenang terhadap database. Role juga dapat dianggap seperti sebuah “user”, sebuah “group” atau keduanya sekaligus tergantung bagaimana menggunakannya.

Membuat user baru artinya sama dengan membuat role baru :

postgres=# CREATE ROLE admin;
CREATE ROLE
postgres=# SELECT rolname FROM pg_roles;
 rolname  
----------
 postgres
 admin
(2 rows)

Sekarang terlihat sudah ada 2 buah user/role :Β postgresΒ danΒ admin.

Memberikan password pada user/role :

postgres=# ALTER ROLE admin WITH PASSWORD 'adminpassword';
ALTER ROLE

Perintah praktis rsync

Syntax dasar perintah rsync

# rsync options source destination

Beberapa opsi (options) dari perintah rsync yang dapat kita manfaatkan, antara lain

  • -v : verbose
  • -r : copy data hingga ke subdirektori terdalam tapi tidak merubah waktu dan permission
  • -a : modus pengarsipan (archive mode), menyalin/copy secara rekursif (hingga direktori2 di bawahnya) dan menyesuaikan Symbolic links, file permission serta user& group ownership dan waktu/timestamps. timestamps.
  • -z : compress file data.
  • -hΒ : human-readable, output numbers in a human-readable format.
  • –dry-run : kalau menggunakan ini maka perintah di jalankan hanya dalam modus simulasi, tidak dieksekusi sesungguhnya
  • — progress : untuk menampilkan progress dari proses synchronization

Contoh copy secara lokal server

rsync -zvh contoh.tar.gz /tmp/backups/

Contoh 1 copy ke remote server

rsync -avzh /root/rpmpkgs root@192.168.0.141:/direktoritujuan

Jika file yang akan dicopy berukuran cukup besar, maka apabila proses copy terputus ditengah jalan, jangan khawatir, rsync akan meneruskan atau melanjutkan sisa yang belum tercopyΒ .

Contoh 2 copy ke remote server

rsync -avu --progress /var/www/moodle-data digitos@103.167.113.106:/data/

Perintah ini akan membuat direktori moodle-data di bawah direktori /data pada tempat tujuan copy, sekaligus menyalin seluruh isinya

Contoh 3 copy ke remote server

rsync -avu --progress /var/www/moodle-data/ digitos@103.167.113.106:/data/

Perintah ini tidak akan membuat direktori moodle-data di bawah direktori /data pada tempat tujuan copy, tetapi sekaligus menyalin seluruh isinya direktori moodle-data langsung di dalam direktori /data/

1 2 3 11