mirror of
https://github.com/ditatompel/insights.git
synced 2025-01-08 03:12:06 +07:00
Compare commits
11 commits
a1c7d902ff
...
5d62aacd85
Author | SHA1 | Date | |
---|---|---|---|
|
5d62aacd85 | ||
e13a117be4 | |||
f984c57952 | |||
5d0965673d | |||
8d08ace495 | |||
61eb82c207 | |||
30d5fe6306 | |||
ebf99032c8 | |||
01a244a9b2 | |||
a62c573ca8 | |||
0808d73410 |
35 changed files with 3188 additions and 582 deletions
|
@ -1,84 +1,79 @@
|
|||
---
|
||||
title: "Bijak Dalam Pemilihan Dan Penggunaan Password / Kata Sandi"
|
||||
description: "Membahas bagaimana seharusnya Anda membuat dan memperlakukan kata sandi Anda serta tips menggunakan password manager untuk mempermudah manajemen password yang unik dan acak di setiap situs / aplikasi yang Anda gunakan"
|
||||
summary: "Membahas bagaimana seharusnya Anda membuat dan memperlakukan kata sandi Anda serta tips menggunakan password manager untuk mempermudah manajemen password yang unik dan acak di setiap situs / aplikasi yang Anda gunakan"
|
||||
date: 2022-09-09T19:47:48+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: true
|
||||
pinned: false
|
||||
# comments: false
|
||||
featured: false
|
||||
pinned: true
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
- Security
|
||||
tags:
|
||||
- Bitwarden
|
||||
- KeepassXC
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Password adalah sesuatu yang rahasia, artikel ini membahas bagaimana seharusnya Anda membuat dan memperlakukan kata sandi Anda serta [tips menggunakan password manager](#gunakan-password-manager-yang-open-source) untuk mempermudah manajemen password yang unik dan acak di setiap situs / aplikasi yang Anda gunakan.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Di lingkungan saya, masih banyak teman-teman saya menggunakan password yang sama di berbagai macam situs. Hal ini sudah menjadi kebiasaan dan akan berdampak sangat buruk jika password yang sama tersebut bocor ke publik, apa lagi di era yang serba digital ini.
|
||||
|
||||
Jadi, bagaimana seharusnya kita memperlakukan dan membuat password yang baik? Berikut ini 5 poin paling penting (menurut saya) mengenai password dan tips menggunakan **password manager**.
|
||||
Jadi, bagaimana seharusnya kita memperlakukan dan membuat password yang baik? Berikut ini 5 poin paling penting (menurut saya) mengenai password dan tips menggunakan **password manager**.
|
||||
|
||||
## Jangan pernah membagikan password Anda kepada siapapun
|
||||
Saya ingin nenanamkan salah satu [*Cypherpunk's Manifesto*](https://www.activism.net/cypherpunk/manifesto.html) mengenai perbedaan *private* (pribadi) dengan *secret* (rahasia) kepada Anda. ***Secret* adalah sesuatu yang <u>hanya</u> Anda yang tahu**, tidak ada orang lain yang boleh tau. Sedangkan ***private* adalah sesuatu yang Anda tidak ingin seluruh dunia tau**. *Private* itu seperti alamat rumah, nomor telepon, bentuk alat kela.... (*ah sudahlah...*), dsb. Orang-orang terdekat Anda boleh tahu tentang suatu yang private / pribadi mengenai diri Anda.
|
||||
|
||||
Saya ingin nenanamkan salah satu [_Cypherpunk's Manifesto_](https://www.activism.net/cypherpunk/manifesto.html) mengenai perbedaan _private_ (pribadi) dengan _secret_ (rahasia) kepada Anda. **_Secret_ adalah sesuatu yang <u>hanya</u> Anda yang tahu**, tidak ada orang lain yang boleh tau. Sedangkan **_private_ adalah sesuatu yang Anda tidak ingin seluruh dunia tau**. _Private_ itu seperti alamat rumah, nomor telepon, bentuk alat kela.... (_ah sudahlah..._), dsb. Orang-orang terdekat Anda boleh tahu tentang suatu yang private / pribadi mengenai diri Anda.
|
||||
|
||||
Sedangkan password adalah sesuatu yang rahasia, cuma Anda dan hanya Anda yang boleh tau. Tanamkan pada pikiran Anda bahwa ketika Anda sudah membagikan password Anda sendiri, Anda telah melakukan sesuatu yang sangat berdosa dan tidak dapat diampuni, paham? Bahkan jika Anda memiliki istri / suami dan meminta password Anda secara paksa, CERAIKAN! :smiling_imp:
|
||||
|
||||
## Jangan gunakan password yang sama
|
||||
|
||||
Selalu gunakan password yang berbeda di SETIAP situs / aplikasi yang Anda gunakan. Ini wajib hukumnya, kenapa? Karena kita tidak pernah tahu bagaimana mekanisme atau kebijakan situs tempat kita mendaftar.
|
||||
|
||||
Apakah mereka sudah mengimplementasikan penyimpanan password sesuai standard? Apakah hanya menggunakan *one-way-hash* tanpa mengimplementasikan [*salt*](https://en.wikipedia.org/wiki/Salt_(cryptography)) saat menyimpan password? Apakah algoritma *hash* yang digunakan cukup aman dari serangan seperti [Dictionary Attack](https://en.wikipedia.org/wiki/Dictionary_attack) atau [Rainbow Attack](https://www.beyondidentity.com/glossary/rainbow-table-attack)? Bahkan, bagi yang belum tau, situs sekelas [**Facebook** pernah menyimpan password penggunanya dalam bentuk *plain-text*](https://techcrunch.com/2019/03/21/facebook-plaintext-passwords/). :clap: :shit:
|
||||
Apakah mereka sudah mengimplementasikan penyimpanan password sesuai standard? Apakah hanya menggunakan _one-way-hash_ tanpa mengimplementasikan [_salt_](<https://en.wikipedia.org/wiki/Salt_(cryptography)>) saat menyimpan password? Apakah algoritma _hash_ yang digunakan cukup aman dari serangan seperti [Dictionary Attack](https://en.wikipedia.org/wiki/Dictionary_attack) atau [Rainbow Attack](https://www.beyondidentity.com/glossary/rainbow-table-attack)? Bahkan, bagi yang belum tau, situs sekelas [**Facebook** pernah menyimpan password penggunanya dalam bentuk _plain-text_](https://techcrunch.com/2019/03/21/facebook-plaintext-passwords/). :clap: :shit:
|
||||
|
||||
Kita semua yang hidup didunia teknologi yakin dan percaya bahwa tidak ada sistem yang sempurna, karena kesempurnaan hanya milik ~~saya~~ Tuhan :angel:. Kalau kita berandai-andai sistem dari situs yang kita gunakan sempurna tanpa cacat dari *layer 1* hingga *layer 7* [OSI model](https://en.wikipedia.org/wiki/OSI_model), ingat bahwa sebuah sistem tetap dioperasikan oleh manusia.
|
||||
Kita semua yang hidup didunia teknologi yakin dan percaya bahwa tidak ada sistem yang sempurna, karena kesempurnaan hanya milik ~~saya~~ Tuhan :angel:. Kalau kita berandai-andai sistem dari situs yang kita gunakan sempurna tanpa cacat dari _layer 1_ hingga _layer 7_ [OSI model](https://en.wikipedia.org/wiki/OSI_model), ingat bahwa sebuah sistem tetap dioperasikan oleh manusia.
|
||||
|
||||
Saya sebagai *SysAdmin* / *programmer* dapat dengan mudah menyisipkan beberapa baris kode yang memerintahkan untuk (misalnya) mengirimkan username / email dan password yang diinput oleh *user* ke email pribadi saya, baru menyimpannya dengan *salted hash* ke database yang digunakan. Jadi jangan pernah mempercayakan sesuatu yang penting begitu saja, terutama ke perusahaan yang memperkejakan orang semacam saya :smiling_imp:.
|
||||
Saya sebagai _SysAdmin_ / _programmer_ dapat dengan mudah menyisipkan beberapa baris kode yang memerintahkan untuk (misalnya) mengirimkan username / email dan password yang diinput oleh _user_ ke email pribadi saya, baru menyimpannya dengan _salted hash_ ke database yang digunakan. Jadi jangan pernah mempercayakan sesuatu yang penting begitu saja, terutama ke perusahaan yang memperkejakan orang semacam saya :smiling_imp:.
|
||||
|
||||
Ketika password Anda sudah didapatkan, apa lagi dalam bentuk *plain-text*, akun Anda di situs lain dapat diakses dengan mudah, apa lagi jika Anda tidak mengaktifkan fitur semacam [2FA](https://en.wikipedia.org/wiki/Multi-factor_authentication).
|
||||
Ketika password Anda sudah didapatkan, apa lagi dalam bentuk _plain-text_, akun Anda di situs lain dapat diakses dengan mudah, apa lagi jika Anda tidak mengaktifkan fitur semacam [2FA](https://en.wikipedia.org/wiki/Multi-factor_authentication).
|
||||
|
||||
## Gunakan password yang panjang dan kompleks
|
||||
|
||||
![Password Brute Force Table](feature-password-brute-time-table.png#center "Password Brute Force Table")
|
||||
|
||||
Gambar table diatas menginformasikan berapa lama waktu yang dibutuhkan untuk mendapatkan *plain-text password* menggunakan **Nvidia GeForce 1080** dengan asumsi dapat melakukan *brute force attack* sebanyak 30 juta kali dalam 1 detik.
|
||||
Gambar table diatas menginformasikan berapa lama waktu yang dibutuhkan untuk mendapatkan _plain-text password_ menggunakan **Nvidia GeForce 1080** dengan asumsi dapat melakukan _brute force attack_ sebanyak 30 juta kali dalam 1 detik.
|
||||
|
||||
Tentu saja simulasi tersebut bervariasi tergantung kemampuan *hardware* terhadap algoritma *hash* yang digunakan. Gunakanlah **password minimal 12 karakter acak yang mengandung angka, simbol, huruf besar dan huruf kecil**. Semakin panjang akan semakin baik karena teknologi dan kemampuan hardware berkembang sangat cepat.
|
||||
Tentu saja simulasi tersebut bervariasi tergantung kemampuan _hardware_ terhadap algoritma _hash_ yang digunakan. Gunakanlah **password minimal 12 karakter acak yang mengandung angka, simbol, huruf besar dan huruf kecil**. Semakin panjang akan semakin baik karena teknologi dan kemampuan hardware berkembang sangat cepat.
|
||||
|
||||
> Maksud **password acak** disini adalah password yang sama sekali tidak terlihat sebagai sebuah kata, entah itu kata benda maupun kata sifat. Contoh password acak : `i7#xYkU9Txd@5Y`
|
||||
|
||||
> Meskipun terdapat faktor lain yang dapat mempersingkat waktu yang dibutuhkan untuk mendapatkan *plan-text password* karena adanya [*Hash collision*](https://en.wikipedia.org/wiki/Hash_collision), tapi dengan password yang kompleks setidaknya memperkecil pilihan yang dapat digunakan *cracker* sehingga mereka tidak dengan mudah mendapatkan *plain-text password* kita.
|
||||
> Meskipun terdapat faktor lain yang dapat mempersingkat waktu yang dibutuhkan untuk mendapatkan _plan-text password_ karena adanya [_Hash collision_](https://en.wikipedia.org/wiki/Hash_collision), tapi dengan password yang kompleks setidaknya memperkecil pilihan yang dapat digunakan _cracker_ sehingga mereka tidak dengan mudah mendapatkan _plain-text password_ kita.
|
||||
|
||||
## Hindari menggunakan password yang mengandung identifikasi pribadi
|
||||
|
||||
Rata-rata, orang memilih menggunakan dan menyantumkan suatu yang personal di password mereka. Misalnya:
|
||||
|
||||
- **Tanggal lahir**: ditatompel09111978 atau 19781109dita
|
||||
- **Alamat**: tompelBrooklyn12St
|
||||
- **Nomor Telepon**: dita7576
|
||||
- **Hobi**: Colly3x24
|
||||
|
||||
*\*Yang terakhir abaikan* :speak_no_evil:.
|
||||
_\*Yang terakhir abaikan_ :speak_no_evil:.
|
||||
|
||||
Hal-hal yang dapat ditebak dari informasi tersebut dapat dimanfaatkan untuk melakukan [*Brute Force*](https://en.wikipedia.org/wiki/Brute-force_attack) terhadap password Anda. Jadi **gunakan password yang susah ditebak dan sama sekali tidak ada hubungannya dengan Anda**.
|
||||
Hal-hal yang dapat ditebak dari informasi tersebut dapat dimanfaatkan untuk melakukan [_Brute Force_](https://en.wikipedia.org/wiki/Brute-force_attack) terhadap password Anda. Jadi **gunakan password yang susah ditebak dan sama sekali tidak ada hubungannya dengan Anda**.
|
||||
|
||||
## Jangan simpan password Anda di browser atau mencatatnya ke dokumen digital tanpa enkripsi
|
||||
Jangan pernah simpan password Anda di browser. Fitur penyimpanan password dari sebagian besar browser *mainstream* tidak mengimplementasikan enkripsi, jadi password Anda kemungkinan besar disimpan dalam bentuk *plain-text*. Dan ketika PC / laptop kita dipinjam oleh teman atau kerabat, hanya butuh beberapa detik saja untuk mengambil password yang tersimpan di browser.
|
||||
|
||||
Begitu pula dengan fitur penyimpanan password bawaan dari ponsel, sebisa mungkin hindari menyimpan di sana dan gunakan **Password Manager** yang *open-source* yang nanti akan saya bahas juga di akhir artikel.
|
||||
Jangan pernah simpan password Anda di browser. Fitur penyimpanan password dari sebagian besar browser _mainstream_ tidak mengimplementasikan enkripsi, jadi password Anda kemungkinan besar disimpan dalam bentuk _plain-text_. Dan ketika PC / laptop kita dipinjam oleh teman atau kerabat, hanya butuh beberapa detik saja untuk mengambil password yang tersimpan di browser.
|
||||
|
||||
Begitu pula dengan fitur penyimpanan password bawaan dari ponsel, sebisa mungkin hindari menyimpan di sana dan gunakan **Password Manager** yang _open-source_ yang nanti akan saya bahas juga di akhir artikel.
|
||||
|
||||
## Mengubah password secara berkala sudah tidak relevan
|
||||
|
||||
|
@ -86,56 +81,59 @@ Begitu pula dengan fitur penyimpanan password bawaan dari ponsel, sebisa mungkin
|
|||
|
||||
Dikutip dari situs [tempo.co](https://bisnis.tempo.co/read/1630039/kebocoran-data-pribadi-terjadi-lagi-johnny-plate-masyarakat-harus-sering-ganti-password), {{< katex formula="\large yang" inline=true />}} {{< katex formula="\large mulia" inline=true />}} **Mentri Kemenkominfo** {{< katex formula="\large maha" inline=true />}} {{< katex formula="\scriptstyle da" inline=true />}}{{< katex formula="\cal S\Eta\Iota\large T" inline=true />}}, Pak **Johnny G Plate** mengatakan :
|
||||
|
||||
> *"One time password itu harus selalu kita ganti sehingga kita bisa menjaga agar data kita tidak diterobos,"*.
|
||||
> _"One time password itu harus selalu kita ganti sehingga kita bisa menjaga agar data kita tidak diterobos,"_.
|
||||
|
||||
{{< katex >}}
|
||||
{one + time + password \above{2pt} harus + selalu + kita + ganti} \\\
|
||||
{one + time + password \above{2pt} harus + selalu + kita + ganti} \\\
|
||||
\\
|
||||
|
||||
\begin{Bmatrix}
|
||||
W + k + W + k + W + k \\
|
||||
w + K + W + k + w + K
|
||||
\end{Bmatrix} ^{8x} \\
|
||||
\underbrace{TROLLLol0lol0lol0lol0lol0lol}_{\LARGE \text{ \textdagger} RIP \text{ } \xcancel{teknologi}\text{ \textdagger}} \\\
|
||||
W + k + W + k + W + k \\
|
||||
w + K + W + k + w + K
|
||||
\end{Bmatrix} ^{8x} \\
|
||||
\underbrace{TROLLLol0lol0lol0lol0lol0lol}\_{\LARGE \text{ \textdagger} RIP \text{ } \xcancel{teknologi}\text{ \textdagger}} \\\
|
||||
\\
|
||||
{{< /katex >}}
|
||||
|
||||
*Ahemmm...* Jadi yang sama sekali belum mengerti bahasa *enggres*, **OTP** atau *one-time password* artinya password yang hanya digunakan 1 kali saja. Setelah digunakan **atau** sudah melewati batas waktu tertentu, password tersebut sudah tidak dapat digunakan lagi. Jadi *by nature* dia selalu berubah dan bukan kita yang menentukan nilai dari **OTP** tersebut.
|
||||
_Ahemmm..._ Jadi yang sama sekali belum mengerti bahasa _enggres_, **OTP** atau _one-time password_ artinya password yang hanya digunakan 1 kali saja. Setelah digunakan **atau** sudah melewati batas waktu tertentu, password tersebut sudah tidak dapat digunakan lagi. Jadi _by nature_ dia selalu berubah dan bukan kita yang menentukan nilai dari **OTP** tersebut.
|
||||
|
||||
> *Saya yakin pak mentri bukannya tidak mengerti, tapi memang salah bicara. Maksud beliau pasti password biasa, bukan OTP. Ya pak ya? Ya kan pak? Ya kan?* :worried:
|
||||
> _Saya yakin pak mentri bukannya tidak mengerti, tapi memang salah bicara. Maksud beliau pasti password biasa, bukan OTP. Ya pak ya? Ya kan pak? Ya kan?_ :worried:
|
||||
|
||||
Kembali ke topik mengenai kenapa menurut saya mengubah password secara berkala sudah tidak relevan, karena untuk mengingat situs atau aplikasi yang kita pernah mendaftar saja sudah sangatlah susah, apa lagi harus mengubahnya secara berkala dengan password acak yang berbeda.
|
||||
|
||||
Menurut saya pribadi, dengan mengimplementasikan poin-poin yang sudah saya sebutkan di atas sudah cukup (untuk orang-orang pada umumnya).
|
||||
|
||||
## Gunakan Password Manager yang open-source
|
||||
Poin-poin diatas yang saya sebutkan akan sangat sulit dilakukan tanpa adanya *sofware* **Password Manager**. Gunakanlah password manager yang *open-source* yang sudah dan dapat diaudit secara bebas kapan saja oleh publik.
|
||||
|
||||
Ada banyak software password manager yang *open-source* seperti [Bitwarden](https://bitwarden.com/), [KeepassXC](https://keepassxc.org/), [Padloc](https://padloc.app/), dsb. Jika Anda **memiliki infrastruktur dan kemampuan** dalam membangun dan memanage *self-hosted server* dari password manager tersebut, akan lebih baik jika Anda menggunakan versi *self-hosted*nya.
|
||||
Poin-poin diatas yang saya sebutkan akan sangat sulit dilakukan tanpa adanya _sofware_ **Password Manager**. Gunakanlah password manager yang _open-source_ yang sudah dan dapat diaudit secara bebas kapan saja oleh publik.
|
||||
|
||||
Ada banyak software password manager yang _open-source_ seperti [Bitwarden](https://bitwarden.com/), [KeepassXC](https://keepassxc.org/), [Padloc](https://padloc.app/), dsb. Jika Anda **memiliki infrastruktur dan kemampuan** dalam membangun dan memanage _self-hosted server_ dari password manager tersebut, akan lebih baik jika Anda menggunakan versi *self-hosted*nya.
|
||||
|
||||
### Tips menggunakan password manager
|
||||
|
||||
Untuk dapat mengikuti tips saya ini, Anda memerlukan:
|
||||
|
||||
- 2 buah akun email, 1 diantaranya adalah email yang **tidak pernah** Anda gunakan untuk registrasi **dimanapun**.
|
||||
- Mampu mengingat paling tidak 3 buah password kompleks yang berbeda (**minimal 12 karakter yang mengandung angka, simbol, huruf besar dan huruf kecil**).
|
||||
|
||||
Taruh kata, saya sudah mempunyai 2 buah alamat email berikut:
|
||||
|
||||
1. `ditatompel@gmail.com`
|
||||
2. `administrator@ditatompel.com`
|
||||
|
||||
Email pertama saya gunakan untuk setiap registrasi website yang memerlukan verifikasi email. Ingat dan catat baik-baik password untuk login email tersebut di **OTAK** Anda (jangan pernah tuliskan password login tersebut dimanapun, termasuk password manager).
|
||||
|
||||
Email pertama saya gunakan untuk setiap registrasi website yang memerlukan verifikasi email. Ingat dan catat baik-baik password untuk login email tersebut di **OTAK** Anda (jangan pernah tuliskan password login tersebut dimanapun, termasuk password manager).
|
||||
Email kedua **HANYA** saya gunakan untuk fitur _recovery_ / lupa password dari email pertama. Jangan beritahu kepada siapapun alamat email kedua ini kecuali _provider_ email pertama.
|
||||
|
||||
Email kedua **HANYA** saya gunakan untuk fitur *recovery* / lupa password dari email pertama. Jangan beritahu kepada siapapun alamat email kedua ini kecuali *provider* email pertama.
|
||||
Biasanya email _provider_ sekelas **Gmail** juga akan mengirimkan notifikasi ke email _recovery_ jika ada aktifitas yang dianggap mencurigakan dari akun Anda. Gunakan password yang berdeda dari email yang pertama untuk megakses email _recovery_ ini (Ingat dan catat baik-baik password untuk login email tersebut di **OTAK** Anda (jangan pernah tuliskan password login dimanapun, termasuk password manager).
|
||||
|
||||
Biasanya email *provider* sekelas **Gmail** juga akan mengirimkan notifikasi ke email *recovery* jika ada aktifitas yang dianggap mencurigakan dari akun Anda. Gunakan password yang berdeda dari email yang pertama untuk megakses email *recovery* ini (Ingat dan catat baik-baik password untuk login email tersebut di **OTAK** Anda (jangan pernah tuliskan password login dimanapun, termasuk password manager).
|
||||
Register ke situs penyedia password manager menggunakan email pertama. Biasanya password manager akan meminta anda untuk menentukan **_Master Password_** Anda. Gunakan password yang berbeda dari password email pertama dan kedua. Dan, lagi-lagi: ingat dan catat baik-baik **_Master Password_** tersebut di **OTAK** Anda (jangan pernah tuliskan **Master Password** dimanapun, termasuk password manager itu sendiri).
|
||||
|
||||
Register ke situs penyedia password manager menggunakan email pertama. Biasanya password manager akan meminta anda untuk menentukan ***Master Password*** Anda. Gunakan password yang berbeda dari password email pertama dan kedua. Dan, lagi-lagi: ingat dan catat baik-baik ***Master Password*** tersebut di **OTAK** Anda (jangan pernah tuliskan **Master Password** dimanapun, termasuk password manager itu sendiri).
|
||||
Jangan lupa aktifkan **2FA/OTP** (jika _provider_ menyediakan fitur tersebut) untuk mengakses 3 akun penting diatas (email pertama, kedua, dan password manager).
|
||||
|
||||
Jangan lupa aktifkan **2FA/OTP** (jika *provider* menyediakan fitur tersebut) untuk mengakses 3 akun penting diatas (email pertama, kedua, dan password manager).
|
||||
|
||||
Gunakan password manager untuk *mengenerate* dan menyimpan semua password situs atau aplikasi yang Anda gunakan **diluar** email pertama, email kedua, dan master password dari pasword manager yang Anda gunakan tersebut.
|
||||
Gunakan password manager untuk _mengenerate_ dan menyimpan semua password situs atau aplikasi yang Anda gunakan **diluar** email pertama, email kedua, dan master password dari pasword manager yang Anda gunakan tersebut.
|
||||
|
||||
Dengan begitu, Anda benar-benar memiliki password acak yang berbeda untuk setiap situs atau aplikasi yang Anda gunakan tanpa harus repot mengingat. Semoga artikel ini berguna dan dapat menambah wawasan.
|
||||
|
||||
> Catatan khusus mengenai email, jika Anda menggunakan penyedia layanan email seperti Yahoo! atau Google, Anda bisa kehilangan akun email Anda jika Anda tidak pernah melakukan login dalam kurun waktu tertentu. Pembahasan mengenai hal ini saya tulis dalam bahasa Inggris di berjudul [*"Why Inactive Email Accounts is Dangerous"*](https://insights.ditatompel.com/en/blog/2020/06/why-inactive-email-accounts-is-dangerous/).
|
||||
Jadi, selalu sempatkan login ke penyedia layanan email yang Anda gunakan minimal 2 bulan sekali.
|
||||
> Catatan khusus mengenai email, jika Anda menggunakan penyedia layanan email seperti Yahoo! atau Google, Anda bisa kehilangan akun email Anda jika Anda tidak pernah melakukan login dalam kurun waktu tertentu. Pembahasan mengenai hal ini saya tulis dalam bahasa Inggris di berjudul [_"Why Inactive Email Accounts is Dangerous"_](https://insights.ditatompel.com/en/blog/2020/06/why-inactive-email-accounts-is-dangerous/).
|
||||
> Jadi, selalu sempatkan login ke penyedia layanan email yang Anda gunakan minimal 2 bulan sekali.
|
||||
|
|
|
@ -0,0 +1,139 @@
|
|||
---
|
||||
title: "Password 101: Best Practices for Secure Online Living"
|
||||
description: "Discusses how you should create and treat your passwords as well as tips for using a password manager to make it easier to manage unique and random passwords on every site / application you use."
|
||||
summary: "Discusses how you should create and treat your passwords as well as tips for using a password manager to make it easier to manage unique and random passwords on every site/application you use."
|
||||
date: 2022-09-09T19:47:48+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: true
|
||||
pinned: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
- Security
|
||||
tags:
|
||||
- Bitwarden
|
||||
- KeepassXC
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
The password is a crucial aspect of online security. This article explores how to create and manage strong, unique passwords, as well as [tips for using an open-source password manager](#tips-for-using-a-password-manager) to securely store and access your credentials on various websites and apps.
|
||||
|
||||
So, how should we treat and create good passwords? Here are 5 crucial points (in my opinion) regarding passwords and tips for using **a password manager**.
|
||||
|
||||
## Never Share Your Password with Anyone
|
||||
|
||||
I'd like to remind you of one of the key differences between **_private_** and **_secret_** according to the [_Cypherpunk's Manifesto_](https://www.activism.net/cypherpunk/manifesto.html).
|
||||
|
||||
**A secret is something that only you know**, nobody else should know. On the other hand, **private is something you don't want the whole world to know**. It's like your home address, phone number, or the shape of your personal belongings... (you get the idea). Your closest acquaintances may be aware of certain private aspects about yourself.
|
||||
|
||||
A password, however, is a secret matter that **only you** should know. Think of sharing your password as betraying yourself – something to be avoided at all costs. Not even a trusted partner or family member deserves access to this secret information.
|
||||
|
||||
## Never Use the Same Password
|
||||
|
||||
Many of my friends still use the same passwords across various websites. When you use the same password across multiple websites and apps, you're inviting potential disaster into your digital life.
|
||||
|
||||
The rule is clear: use separate passwords for each website and app. Why? Because if those credentials were to leak into the public domain, the consequences would be severe.
|
||||
|
||||
Even the most secure-looking websites can fall victim to data breaches. Even well-known websites have made mistakes before – like [**Facebook** was once stored its users' passwords in plain text](https://techcrunch.com/2019/03/21/facebook-plaintext-passwords/). :clap: :shit:
|
||||
|
||||
Imagine waking up one morning to find that your personal info has been compromised, or worse – your financial accounts have been drained. It's a nightmare scenario that can be avoided by using unique passwords for each online account.
|
||||
|
||||
The best-designed systems can have flaws, and those operated by well-intentioned and experienced humans are not immune to mistakes and imperfections. Therefore, never use the same password and enable two-factor authentication (2FA) to make it even safer.
|
||||
|
||||
## Use a Long and Complex Password
|
||||
|
||||
![Password Brute Force Table](feature-password-brute-time-table.png#center "Password Brute Force Table")
|
||||
|
||||
The table above provides information on how long it takes to obtain a plain-text password using **an Nvidia GeForce 1080**, assuming we can perform a brute-force attack 30 million times in one second.
|
||||
|
||||
Of course, this simulation varies depending on the hardware's capabilities and the hash algorithm used. Use a **minimum of 12 random characters containing numbers, symbols, uppercase letters, and lowercase letters**. The longer it is, the better, as technology and hardware capabilities develop rapidly.
|
||||
|
||||
> By **a truly random password**, I mean one that is completely unrecognizable as a word, whether noun or adjective. For example: `i7#xYkU9Txd@5Y`
|
||||
|
||||
> Although there are other factors that can shorten the time needed to obtain a plain-text password due to **hash collisions** (see [Wikipedia Hash Collision](https://en.wikipedia.org/wiki/Hash_collision)), using a complex password at least reduces the options available to crackers, making it harder for them to easily obtain our plain-text password.
|
||||
|
||||
## Avoid Using Personal Identifiers in Your Passwords
|
||||
|
||||
Many people tend to choose and combine personal information in their passwords. For example:
|
||||
|
||||
- **Date of birth**: ditatompel09111978 or 19781109dita
|
||||
- **Address**: tompelBrooklyn12St
|
||||
- **Phone Number**: dita7576
|
||||
- **Hobby**: Fap3x24
|
||||
|
||||
_\*Forget the last one_ :speak_no_evil:.
|
||||
|
||||
Information that can be inferred from this data can be exploited for a [_Brute Force_](https://en.wikipedia.org/wiki/Brute-force_attack) attack on your password. So, **use a password that is difficult to guess and completely random**.
|
||||
|
||||
## Don't Store Your Passwords Within Browser's Built-in Password Management or Unencrypted Document
|
||||
|
||||
Avoid storing your passwords within a browser's built-in password management feature. Most mainstream browsers' built-in password management features do not implement encryption or additional authentication measures, so your password may be stored in plaintext on your device. If someone borrows our PC/laptop, it only takes a few seconds to retrieve the stored password.
|
||||
|
||||
Similarly, avoid storing passwords on built-in phone features as well, and instead use an **Open-Source Password Manager** that I will discuss later in this article.
|
||||
|
||||
## Changing Passwords Regularly is No Longer Relevant
|
||||
|
||||
![OTP according to Kominfo](pak-menkom-johnny-ngomong-otp-harus-selalu-diganti-lmao.jpg#center "OTP according to Indonesia Minister of Communication and Information Technology")
|
||||
|
||||
[Tempo.co](https://bisnis.tempo.co/read/1630039/kebocoran-data-pribadi-terjadi-lagi-johnny-plate-masyarakat-harus-sering-ganti-password), quoting **Indonesia Minister of Communication and Information Technology**, Mr. **Johnny G Plate**:
|
||||
|
||||
> _"One time password itu harus selalu kita ganti sehingga kita bisa menjaga agar data kita tidak diterobos,"_.
|
||||
|
||||
Translated to English:
|
||||
|
||||
> _"We must always change our one-time password so that our data is not breached,"_.
|
||||
|
||||
Hmm... Excuse me! **OTP** or one-time password means a password that's only used once. After being used, the password is no longer valid. By nature, it changes itself and it's not us who decide its value.
|
||||
|
||||
> _I'm sure the minister doesn't really mean it. His intention was probably about regular passwords, wasn't it? right? Yeah?_ :worried:
|
||||
|
||||
Back to the topic of why I think changing passwords regularly is no longer relevant: because remembering the site or app we signed up for is already difficult, let alone having to change them regularly with random complex passwords.
|
||||
|
||||
In my personal opinion, by implementing the points I mentioned earlier, it's sufficient (for most people).
|
||||
|
||||
## Password Managers
|
||||
|
||||
The points I mentioned above will be very difficult to achieve without a **Password Manager**. Use an open-source password manager that can be freely audited by the public at any time.
|
||||
|
||||
There are many open-source password managers like [Bitwarden](https://bitwarden.com/), [KeepassXC](https://keepassxc.org/), [Padloc](https://padloc.app/), etc. If you have the infrastructure and capabilities to build and manage a _self-hosted server_ for your password manager, it would be better if you use its self-hosted version.
|
||||
|
||||
### Tips for Using a Password Manager
|
||||
|
||||
To follow my tips, you'll need:
|
||||
|
||||
- 2 email accounts, one of which is an email address **that has never been used** to register anywhere.
|
||||
- The ability to remember at least 3 complex passwords that are different (**minimum 12 characters including numbers, symbols, uppercase and lowercase letters**).
|
||||
|
||||
So, let say I already have two email addresses:
|
||||
|
||||
1. `ditatompel@gmail.com`
|
||||
2. `administrator@ditatompel.com`
|
||||
|
||||
I use the first email for every website registration that requires email verification (primary email). Remember and note down the password for logging in to this email **in your brain memory** (never write it anywhere, including a password manager).
|
||||
|
||||
The second email is **only** used for the recovery/reset password feature from the primary email. Don't tell anyone about this recovery email address except the provider of the primary email (in this case: Gmail).
|
||||
|
||||
> When you set up a recovery email address with your provider (such as Gmail), they will typically send notifications to that email if they detect suspicious activity on your account. Even if your primary email account has been compromised, you can still maintain control over your account by accessing it through the recovery email.
|
||||
|
||||
Register to your password manager provider using your primary email. Usually, the password manager will ask you to set up a **Master Password**. Use a different password from the passwords of the primary and recovery email. And, again: remember and note down the **Master Password** in your brain (never write it anywhere, including the password manager itself).
|
||||
|
||||
Don't forget to enable 2FA/OTP (if the provider offers this feature) for accessing these three important accounts (the primary email, the recovery email, and the password manager).
|
||||
|
||||
Use the password manager to generate and store all passwords for websites or applications you use **except** the primary email, the recovery email, and the master password of the password manager.
|
||||
|
||||
That way, you'll have different random passwords for each website or application you use without having to bother remembering them. I hope this article is helpful and adds insight.
|
||||
|
||||
> **NOTES**:
|
||||
>
|
||||
> - This tip won't be useful if your PC or device is already infected with malicious software like a keylogger.
|
||||
> - Special note about email: If you use an email service provider like Yahoo! or Google, you may lose your email account if you never log in within a certain period of time. I wrote about this topic: ["_Why Inactive Email Accounts is Dangerous_"](https://insights.ditatompel.com/en/blog/2020/06/why-inactive-email-accounts-is-dangerous/). So, always make it a habit to log in to your email service provider at least once every 2 months.
|
||||
|
||||
Resources:
|
||||
|
||||
- Random data fed or [_salt (Cryptography)_](<https://en.wikipedia.org/wiki/Salt_(cryptography)>)
|
||||
- [Dictionary Attack](https://en.wikipedia.org/wiki/Dictionary_attack)
|
||||
- [Rainbow Table Attack](https://www.beyondidentity.com/glossary/rainbow-table-attack)
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Cara Akses Reddit Tanpa VPN Dengan Libreddit"
|
||||
description: "Buat kamu yang kesulitan mengakses Reddit karena diblokir oleh ISP, menggunakan libreddit adalah cara alternatif dan mudah untuk mengakses Reddit tanpa VPN"
|
||||
summary: "Buat kamu yang kesulitan mengakses Reddit karena diblokir oleh ISP, menggunakan libreddit adalah cara alternatif dan mudah untuk mengakses Reddit tanpa VPN"
|
||||
date: 2023-06-04T23:13:33+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
|
@ -9,7 +10,7 @@ featured: false
|
|||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
- TIL
|
||||
- Privasi
|
||||
|
@ -17,31 +18,18 @@ tags:
|
|||
- Reddit
|
||||
- libreddit
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- vie
|
||||
- jasmerah1966
|
||||
---
|
||||
|
||||
Buat kamu yang kesulitan mengakses **Reddit** karena diblokir oleh **ISP**, menggunakan **libreddit** adalah cara alternatif dan mudah untuk **mengakses Reddit tanpa VPN**.
|
||||
Belakangan ini, banyak yang melaporkan bahwa kawan-kawan di Indonesia mulai kesulitan mengakses **Reddit**. Mungkin karena pemerintah mulai memperketat _"jalur keluar"_ dari _internet checkpoint_ (baca: "[Babak Baru Sensor Internet di Indonesia: DPI & TCP Reset Attack]({{< ref "/blog/new-stage-of-internet-censorship-in-indonesia-dpi-tcp-reset-attack/index.id.md" >}})"). Berikut ini salah satu cara mengakses `reddit.com` tanpa harus menggunakan **VPN**. Contohnya adalah menggunakan [libreddit](https://github.com/libreddit/libreddit).
|
||||
|
||||
<!--more-->
|
||||
---
|
||||
**Libreddit** itu sendiri adalah antar muka (_proxy_) untuk situs `reddit.com` (bukan _official_), jadi dia bertindak sebagai penghubung antara kamu dan situs `reddit.com`.
|
||||
|
||||
Belakangan ini, banyak yang melaporkan bahwa kawan-kawan di Indonesia mulai kesulitan mengakses **Reddit**. Mungkin karena pemerintah mulai memperketat *"jalur keluar"* dari *internet checkpoint* (baca: "[Babak Baru Sensor Internet di Indonesia: DPI & TCP Reset Attack]({{< ref "/blog/new-stage-of-internet-censorship-in-indonesia-dpi-tcp-reset-attack/index.id.md" >}})"). Berikut ini salah satu cara mengakses `reddit.com` tanpa harus menggunakan **VPN**. Contohnya adalah menggunakan [libreddit](https://github.com/libreddit/libreddit).
|
||||
## Libreddit _instance_
|
||||
|
||||
**Libreddit** itu sendiri adalah antar muka (*proxy*) untuk situs `reddit.com` (bukan *official*), jadi dia bertindak sebagai penghubung antara kamu dan situs `reddit.com`.
|
||||
|
||||
## Libreddit *instance*
|
||||
**Libreddit _instance_** adalah mesin yang menjalankan program `libreddit` itu sendiri. *Instance* ini biasanya dioperasikan oleh individu, tapi ada juga kelompok atau organisasi yang mengoperasikan **Libreddit _instance_**.
|
||||
**Libreddit _instance_** adalah mesin yang menjalankan program `libreddit` itu sendiri. _Instance_ ini biasanya dioperasikan oleh individu, tapi ada juga kelompok atau organisasi yang mengoperasikan **Libreddit _instance_**.
|
||||
|
||||
Berikut ini daftar beberapa instance yang dapat kamu pakai:
|
||||
|URL|Location|Behind Cloudflare?|Comment|
|
||||
|
@ -51,55 +39,62 @@ Berikut ini daftar beberapa instance yang dapat kamu pakai:
|
|||
|https://lr.riverside.rocks|🇺🇸 Amerika Serikat|||
|
||||
|https://libreddit.privacy.com.de|🇩🇪 Jerman|||
|
||||
|
||||
Untuk list yang lebih lengkap dan *up-to-date* bisa dilihat di [https://github.com/libreddit/libreddit-instances/blob/master/instances.md](https://github.com/libreddit/libreddit-instances/blob/master/instances.md).
|
||||
Untuk list yang lebih lengkap dan _up-to-date_ bisa dilihat di [https://github.com/libreddit/libreddit-instances/blob/master/instances.md](https://github.com/libreddit/libreddit-instances/blob/master/instances.md).
|
||||
|
||||
## Cara menggunakan libreddit
|
||||
Cara menggunakan `libreddit` sangat mudah, kamu cuma butuh *browser*, kunjungi salah satu [*instance* diatas](#libreddit-instance). Setelah kamu berada di halaman depan *instance* yang kamu pilih, hal pertama yang kamu harus lakukan adalah memilih *subreddit* yang ingin kamu *subscribe*.
|
||||
|
||||
Itu supaya ketika kamu kedepannya mengakses `libreddit` *instance* itu lagi, yang tampil di halaman depan adalah konten-konten dari *subreddit* yang sudah kamu *subscribe*.
|
||||
Cara menggunakan `libreddit` sangat mudah, kamu cuma butuh _browser_, kunjungi salah satu [_instance_ diatas](#libreddit-instance). Setelah kamu berada di halaman depan _instance_ yang kamu pilih, hal pertama yang kamu harus lakukan adalah memilih _subreddit_ yang ingin kamu _subscribe_.
|
||||
|
||||
Caranya, cari *subreddit* yang ingin kamu *subscribe* dari kolom pencarian. Misalnya [r/indonesia](https://safereddit.com/r/indonesia).
|
||||
Itu supaya ketika kamu kedepannya mengakses `libreddit` _instance_ itu lagi, yang tampil di halaman depan adalah konten-konten dari _subreddit_ yang sudah kamu _subscribe_.
|
||||
|
||||
Caranya, cari _subreddit_ yang ingin kamu _subscribe_ dari kolom pencarian. Misalnya [r/indonesia](https://safereddit.com/r/indonesia).
|
||||
|
||||
![Pencarian di libreddit](libreddit-1.png#center)
|
||||
|
||||
Setelah masuk ke halaman *subreddit* yang kamu pilih, tekan tombol _**"Subscribe"**_. Maka posting dari *subreddit* yang sudah kamu *subscribe* tersebut akan otomatis muncul di halaman depan.
|
||||
Setelah masuk ke halaman _subreddit_ yang kamu pilih, tekan tombol _**"Subscribe"**_. Maka posting dari _subreddit_ yang sudah kamu _subscribe_ tersebut akan otomatis muncul di halaman depan.
|
||||
|
||||
## Kelebihan dan kekurangan
|
||||
|
||||
Selalu ada kelebihan dan kekurangan, saya ingin mulai dari kekurangannya dulu baru kelebihannya.
|
||||
|
||||
### Kekurangan
|
||||
Kekurangan paling utama adalah kita hanya bisa *browsing* atau melihat-lihat saja. Karena di `libreddit`, kita tidak perlu *login* (memang tidak bisa). Maka dari itu, kita juga pasti tidak bisa melakukan interaksi dengan pengguna lainnya seperti memberikan komentar, *upvote*, *downvote*, dan lain-lain.
|
||||
|
||||
Kekurangan paling utama adalah kita hanya bisa _browsing_ atau melihat-lihat saja. Karena di `libreddit`, kita tidak perlu _login_ (memang tidak bisa). Maka dari itu, kita juga pasti tidak bisa melakukan interaksi dengan pengguna lainnya seperti memberikan komentar, _upvote_, _downvote_, dan lain-lain.
|
||||
|
||||
### Kelebihan
|
||||
- Tidak perlu **VPN**
|
||||
Untuk mengakses `libreddit`, kita tidak perlu menginstal atau melakukan koneksi **VPN** jika ISP yang kamu pakai memblokir Reddit. Cukup bermodal *browser* dan mengakses Libreddit *instance* yang sudah saya sebutkan diatas.
|
||||
- Tanpa iklan
|
||||
Dengan menggunakan libeddit, kita bisa browsing posting-posting yang ada di Reddit tanpa iklan.
|
||||
- Lebih cepat
|
||||
Dari hasil pengalaman saya, mengakses reddit menggunakan libreddit terasa lebih cepat dan responsif.
|
||||
- Privasi
|
||||
**Libreddit** hanya menggunakan *"Cookie"* untuk menyimpan *menu "Setting"* dan *subreddit* yang kamu *subscribe*. *"Cookie"* tersebut sama sekali tidak menyimpan informasi personal kita.
|
||||
- Pilihan **SFW** *only* / **+NSFW**
|
||||
**Beberapa _libreddit instance_ memilih TIDAK menampilkan** konten **NSFW** (_**SFW** only_), seperti [safereddit.com](https://safereddit.com). Jadi kamu bisa lebih merasa "aman" ketika melakukan browsing reddit disana.
|
||||
|
||||
- Tidak perlu **VPN**
|
||||
Untuk mengakses `libreddit`, kita tidak perlu menginstal atau melakukan koneksi **VPN** jika ISP yang kamu pakai memblokir Reddit. Cukup bermodal _browser_ dan mengakses Libreddit _instance_ yang sudah saya sebutkan diatas.
|
||||
- Tanpa iklan
|
||||
Dengan menggunakan libeddit, kita bisa browsing posting-posting yang ada di Reddit tanpa iklan.
|
||||
- Lebih cepat
|
||||
Dari hasil pengalaman saya, mengakses reddit menggunakan libreddit terasa lebih cepat dan responsif.
|
||||
- Privasi
|
||||
**Libreddit** hanya menggunakan _"Cookie"_ untuk menyimpan _menu "Setting"_ dan _subreddit_ yang kamu _subscribe_. _"Cookie"_ tersebut sama sekali tidak menyimpan informasi personal kita.
|
||||
- Pilihan **SFW** _only_ / **+NSFW**
|
||||
**Beberapa _libreddit instance_ memilih TIDAK menampilkan** konten **NSFW** (_**SFW** only_), seperti [safereddit.com](https://safereddit.com). Jadi kamu bisa lebih merasa "aman" ketika melakukan browsing reddit disana.
|
||||
|
||||
## Tips Memanfaatkan _Plugin **Privacy Redirect**_
|
||||
Sering kali saat kita melakukan pencarian di mesin penelusuran seperti Google.com, muncul konten dari halaman situs Reddit. Namun karena kita tidak dapat mengakses *link* Reddit tersebit karena ISP yang kita gunakan memblokir akses ke situs reddit.com.
|
||||
|
||||
Disini adanya [_plugin browser "**Privacy Redirect**"_](https://github.com/SimonBrazell/privacy-redirect) akan sangat membantu. Dia tugasnya akan melakukan *redirect* (mengubah) *link* asal ke *link* yang sudah kita tentukan sebelumnya.
|
||||
Sering kali saat kita melakukan pencarian di mesin penelusuran seperti Google.com, muncul konten dari halaman situs Reddit. Namun karena kita tidak dapat mengakses _link_ Reddit tersebit karena ISP yang kita gunakan memblokir akses ke situs reddit.com.
|
||||
|
||||
Misalnya, ketika hasil pencarian dari google.com menampilkan *link* ke _https://**reddit.com**/r/indonesia_, ketika kita mengeklik *link* tersebut, _plugin "**Privacy Redirect**"_ akan mengubah *link* tersebut ke _libreddit instance_ pilihan kita yang sudah kita tentukan sebelumnya, misal: _https://**safereddit.com**/r/indonesia_.
|
||||
Disini adanya [_plugin browser "**Privacy Redirect**"_](https://github.com/SimonBrazell/privacy-redirect) akan sangat membantu. Dia tugasnya akan melakukan _redirect_ (mengubah) _link_ asal ke _link_ yang sudah kita tentukan sebelumnya.
|
||||
|
||||
Misalnya, ketika hasil pencarian dari google.com menampilkan _link_ ke _https://**reddit.com**/r/indonesia_, ketika kita mengeklik _link_ tersebut, _plugin "**Privacy Redirect**"_ akan mengubah _link_ tersebut ke _libreddit instance_ pilihan kita yang sudah kita tentukan sebelumnya, misal: _https://**safereddit.com**/r/indonesia_.
|
||||
|
||||
Saat ini, _plugin Privacy Redirect_ tersebut tersedia di [Firefox Add-Ons](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/), [Chrome Web Store](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb), dan [Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/privacy-redirect/elnabkhcgpajchapppkhiaifkgikgihj).
|
||||
|
||||
Cara menggunakannya cukup *install plugin* tersebut ke *browser* yang kamu pakai, masuk ke pilihan **"More Options"** dan masukkan *URL instance* pilihan kamu ke **"Reddit Instance"**.
|
||||
Cara menggunakannya cukup _install plugin_ tersebut ke _browser_ yang kamu pakai, masuk ke pilihan **"More Options"** dan masukkan _URL instance_ pilihan kamu ke **"Reddit Instance"**.
|
||||
|
||||
![Privacy Redirect Plugin](privacy-redirect-plugin.png#center).
|
||||
|
||||
Kamu juga bisa dengan mudah mengaktifkan / menonaktifkan fitur *redirect* per situs dari tombol switch `on` - `off` seperti pada gambar di bawah:
|
||||
Kamu juga bisa dengan mudah mengaktifkan / menonaktifkan fitur _redirect_ per situs dari tombol switch `on` - `off` seperti pada gambar di bawah:
|
||||
|
||||
![Privacy Redirect Plugin Switch](privact-redirect-plugin-swich-on-off.png#center).
|
||||
|
||||
## Alternatif libreddit
|
||||
Selain **libreddit**, ada alternatif lain yang cara kerjanya sama (sebagai *proxy*), yaitu [**teddit**](https://codeberg.org/teddit/teddit). Dari sisi tampilan, **libreddit** lebih mirip dengan desain reddit yang baru, sedangkan **teddit** terlihat mengikuti desain reddit yang lama (`old.reddit.com`).
|
||||
|
||||
Dari sisi bahasa program yang digunakan, libreddit menggunakan **Rust** sedangkan teddit menggunakan **NodeJS**.
|
||||
Selain **libreddit**, ada alternatif lain yang cara kerjanya sama (sebagai _proxy_), yaitu [**teddit**](https://codeberg.org/teddit/teddit). Dari sisi tampilan, **libreddit** lebih mirip dengan desain reddit yang baru, sedangkan **teddit** terlihat mengikuti desain reddit yang lama (`old.reddit.com`).
|
||||
|
||||
Dari sisi bahasa program yang digunakan, libreddit menggunakan **Rust** sedangkan teddit menggunakan **NodeJS**.
|
||||
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
---
|
||||
title: "Accessing Reddit Without VPN Using Libreddit"
|
||||
description: "For individuals who face difficulties accessing Reddit in Indonesia due to ISP restrictions, using libreddit provides an alternative and easy means of accessing the platform without relying on a VPN."
|
||||
summary: "For individuals who face difficulties accessing Reddit in Indonesia due to ISP restrictions, using libreddit provides an alternative and easy means of accessing the platform without relying on a VPN."
|
||||
date: 2023-06-04T23:13:33+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
- TIL
|
||||
- Privacy
|
||||
tags:
|
||||
- Reddit
|
||||
- libreddit
|
||||
images:
|
||||
authors:
|
||||
- vie
|
||||
- jasmerah1966
|
||||
---
|
||||
|
||||
Recently, many users in Indonesia have been experiencing difficulties in accessing Reddit due to Internet Service Provider (ISP) restrictions (read: "[New Stage of Internet Censorship in Indonesia: DPI & TCP Reset Attack]({{< ref "/blog/new-stage-of-internet-censorship-in-indonesia-dpi-tcp-reset-attack/index.md" >}})"). This issue has led to the development of various solutions that allow users to bypass these restrictions and access Reddit seamlessly.
|
||||
|
||||
One such solution is libreddit, a web-based application that enables users to access Reddit without the need for a Virtual Private Network (VPN). In this article, we will explore the features and benefits of using [libreddit](https://github.com/libreddit/libreddit) to access Reddit.
|
||||
|
||||
**Libreddit** is, in itself, an unofficial proxy interface for the website `reddit.com`, functioning as a connector between you and the `reddit.com` site.
|
||||
|
||||
## Libreddit _instances_
|
||||
|
||||
**Libreddit instances** is an engine that runs the `libreddit` program itself. This instance is usually operated by an individual, but there are also groups or organizations that operate a **Libreddit instance**.
|
||||
|
||||
Hereafter is a list of some instances you can use:
|
||||
|
||||
| URL | Location | Behind Cloudflare? | Comment |
|
||||
| -------------------------------- | --------------- | ------------------ | -------- |
|
||||
| https://reddit.moe.ngo | 🇮🇩 Indonesia | ✅ | |
|
||||
| https://safereddit.com | 🇺🇸United States | | SFW only |
|
||||
| https://lr.riverside.rocks | 🇺🇸United States | | |
|
||||
| https://libreddit.privacy.com.de | 🇩🇪Germany | | |
|
||||
|
||||
For a more comprehensive and up-to-date list, please visit [https://github.com/libreddit/libreddit-instances/blob/master/instances.md](https://github.com/libreddit/libreddit-instances/blob/master/instances.md).
|
||||
|
||||
## How to use libreddit
|
||||
|
||||
Using `libreddit` is extremely easy; all you need is a browser, visit one of the instances above. Once you're on the front page of the instance you've chosen, the first thing you should do is select the subreddit you want to subscribe to.
|
||||
|
||||
This way, when you access the `libreddit` instance again in the future, the content that appears on the front page will be from the subreddits you have already subscribed to.
|
||||
|
||||
Here's how: search for the subreddit you want to subscribe to using the search bar. For example, [r/indonesia](https://safereddit.com/r/indonesia).
|
||||
|
||||
![Search on libreddit](libreddit-1.png#center)
|
||||
|
||||
After entering the subreddit page, click the **"Subscribe"** button. Then, posts from the subscribed subreddit will automatically appear on the front page.
|
||||
|
||||
## Advantages and Disadvantages
|
||||
|
||||
There are always pros and cons. I'd like to start with the disadvantages before moving on to the advantages.
|
||||
|
||||
### Disadvantages
|
||||
|
||||
The main disadvantage is that we can only browse or view content; we don't have the option to log in (and therefore can't interact with other users by leaving comments, upvoting, downvoting, etc.).
|
||||
|
||||
### Advantages
|
||||
|
||||
- No need for **VPN**
|
||||
To access `libreddit`, you don't need to install or connect to a **VPN** if your ISP blocks Reddit. Simply use a browser and access the Libreddit instance I mentioned above.
|
||||
- Ad-free
|
||||
With libeddit, you can browse postings on Reddit without ads.
|
||||
- Faster
|
||||
From my experience, accessing Reddit using libreddit feels faster and more responsive.
|
||||
- Privacy
|
||||
**Libreddit** only uses "Cookies" to store your "Settings" and subscribed subreddits. These Cookies do not save any personal information about you.
|
||||
- SFW (Safe For Work) or +NSFW (Not Safe For Work)
|
||||
Some `libreddit` instances choose NOT to display NSFW content (**SFW** only), such as [safereddit.com](https://safereddit.com). So, you can feel more "safe" when browsing Reddit there.
|
||||
|
||||
## Tips for Using the **Privacy Redirect** Plugin
|
||||
|
||||
When searching online using search engines like Google.com, content from Reddit frequently appears in the results. Nevertheless, due to our internet service provider (ISP) blocking access to reddit.com, we are unable to directly access those links.
|
||||
|
||||
That's where the [_plugin browser "**Privacy Redirect**"_](https://github.com/SimonBrazell/privacy-redirect) comes in handy. Its job is to redirect (change) the original link to one that we've previously chosen.
|
||||
|
||||
For example, when a Google search result shows a link to _https://reddit.com/r/indonesia_, if we click on the link, the **Privacy Redirect** plugin will change it to our preferred Libreddit instance, such as _https://safereddit.com/r/indonesia_.
|
||||
|
||||
Currently, this plugin is available at [Firefox Add-Ons](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/), [Chrome Web Store](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb), and [Microsoft Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/privacy-redirect/elnabkhcgpajchapppkhiaifkgikgihj).
|
||||
|
||||
To use it, simply install the plugin on your browser, enter "More Options" and input your preferred URL instance into "Reddit Instance".
|
||||
|
||||
![Privacy Redirect Plugin](privacy-redirect-plugin.png#center).
|
||||
|
||||
You can also easily toggle the redirect feature for each site using the `on` - `off` switch button as shown below:
|
||||
|
||||
![Privacy Redirect Plugin Switch](privact-redirect-plugin-swich-on-off.png#center).
|
||||
|
||||
## Alternative to Libreddit
|
||||
|
||||
In addition to **libreddit**, there is another alternative that works in a similar way (as a _proxy_) called [**teddit**](https://codeberg.org/teddit/teddit). From a visual standpoint, **libreddit** is more similar to the new Reddit design, while **teddit** appears to follow the older Reddit design (`old.reddit.com`).
|
||||
|
||||
From a programming language perspective, libreddit uses **Rust**, whereas teddit uses **NodeJS**.
|
|
@ -1,43 +1,33 @@
|
|||
---
|
||||
title: "Devilzc0de Streaming Radio Amarok Script"
|
||||
description: Berhubung saya adalah tipe orang yang sulit bekerja jika ada banyak browser tab terbuka di browser, saya buat script sederhana supaya radio devilzc0de bisa didengarkan melalui Amarok.
|
||||
summary: Berhubung saya adalah tipe orang yang sulit bekerja jika ada banyak browser tab terbuka di browser, saya buat script sederhana supaya radio devilzc0de bisa didengarkan melalui Amarok.
|
||||
date: 2011-12-29T03:14:32+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
# -
|
||||
# -
|
||||
tags:
|
||||
- Amarok
|
||||
- Linux
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Berhubung saya adalah tipe orang yang sulit bekerja jika ada banyak browser tab terbuka di browser, saya buat script sederhana supaya radio **devilzc0de** bisa didengarkan melalui **Amarok**.
|
||||
Berhubung saya adalah tipe orang yang sulit bekerja jika ada banyak browser tab terbuka di browser, saya buat script sederhana supaya radio **devilzc0de** bisa didengarkan melalui **Amarok**.
|
||||
|
||||
<!--more-->
|
||||
_tested on_ :
|
||||
|
||||
*tested on* :
|
||||
* OS: **Arch Linux** Kernel `3.x` `x86_64`
|
||||
* DE: **KDE** SC `4.7.4`
|
||||
* Qt: `4.8.0`
|
||||
* Source Code : `http://ls-la.ditatompel.crayoncreative.net/linux/devilzc0de_stream.tar.bz2`
|
||||
- OS: **Arch Linux** Kernel `3.x` `x86_64`
|
||||
- DE: **KDE** SC `4.7.4`
|
||||
- Qt: `4.8.0`
|
||||
- Source Code : `http://ls-la.ditatompel.crayoncreative.net/linux/devilzc0de_stream.tar.bz2`
|
||||
|
||||
![](dc-amarok2.png#center)
|
||||
|
||||
|
@ -46,59 +36,64 @@ Berhubung saya adalah tipe orang yang sulit bekerja jika ada banyak browser tab
|
|||
![](dc-amarok4.png#center)
|
||||
|
||||
## List Radio Station
|
||||
* ainstream
|
||||
* Devilzc0de Radio
|
||||
* Radio Bandung
|
||||
* Prambors FM
|
||||
* Delta FM
|
||||
* Radio Surabaya
|
||||
* Mercury 96FM
|
||||
* Prambors FM
|
||||
* Delta FM
|
||||
* Radio Yogyakarta
|
||||
* Redjo Buntung
|
||||
* Jogjafamily
|
||||
* Swaragama
|
||||
* Female FM
|
||||
* Prambors FM
|
||||
* Radio Semarang
|
||||
* Gajahmada FM
|
||||
* TOP FM Bumiayu
|
||||
* Female FM
|
||||
* Prambos FM
|
||||
* Radio Jakarta
|
||||
* Delta FM
|
||||
* Female FM
|
||||
* Prambors FM
|
||||
* Radio Lainnya
|
||||
* Kaskus Radio
|
||||
* Static Stream Crayon Networks
|
||||
* Lagu Galauers
|
||||
* Instrumental
|
||||
* Latest Song Mix
|
||||
|
||||
- ainstream
|
||||
- Devilzc0de Radio
|
||||
- Radio Bandung
|
||||
- Prambors FM
|
||||
- Delta FM
|
||||
- Radio Surabaya
|
||||
- Mercury 96FM
|
||||
- Prambors FM
|
||||
- Delta FM
|
||||
- Radio Yogyakarta
|
||||
- Redjo Buntung
|
||||
- Jogjafamily
|
||||
- Swaragama
|
||||
- Female FM
|
||||
- Prambors FM
|
||||
- Radio Semarang
|
||||
- Gajahmada FM
|
||||
- TOP FM Bumiayu
|
||||
- Female FM
|
||||
- Prambos FM
|
||||
- Radio Jakarta
|
||||
- Delta FM
|
||||
- Female FM
|
||||
- Prambors FM
|
||||
- Radio Lainnya
|
||||
- Kaskus Radio
|
||||
- Static Stream Crayon Networks
|
||||
- Lagu Galauers
|
||||
- Instrumental
|
||||
- Latest Song Mix
|
||||
|
||||
## Cara Install
|
||||
Cara installasi bisa menggunakan 2 metode, yaitu menggunakan **Amarok script manager** (*single user*) atau manual (*all users*).
|
||||
|
||||
### Menggunakan Amarok script manager (*single user*)
|
||||
Cara installasi bisa menggunakan 2 metode, yaitu menggunakan **Amarok script manager** (_single user_) atau manual (_all users_).
|
||||
|
||||
### Menggunakan Amarok script manager (_single user_)
|
||||
|
||||
1. Buka Amarok
|
||||
2. Masuk **Settings** -> **Configure Amarok** -> **Script** -> **Manage Scripts**
|
||||
3. Search dengan *keyword* **Devilzc0de** -> **Install**
|
||||
3. Search dengan _keyword_ **Devilzc0de** -> **Install**
|
||||
|
||||
![](dc-amarok1.png#center)
|
||||
|
||||
### Manual (*all users*)
|
||||
### Manual (_all users_)
|
||||
|
||||
```bash
|
||||
wget http://ls-la.ditatompel.crayoncreative.net/linux/devilzc0de_stream.tar.bz2
|
||||
```
|
||||
Sebagai *user* `root`, *extract* kemudian *copy* folder hasil *extract* ke `/usr/share/apps/amarok/scripts/`.
|
||||
|
||||
Sebagai _user_ `root`, _extract_ kemudian _copy_ folder hasil _extract_ ke `/usr/share/apps/amarok/scripts/`.
|
||||
|
||||
## Cara Penggunaan
|
||||
|
||||
1. Masuk ke menu **internet**.
|
||||
2. Pilih **devilzc0de Radio**.
|
||||
3. Pilih stasiun radio yang ingin didengarkan.
|
||||
|
||||
Maaf belum sempat buat untuk *player* dan *desktop environment* laen.
|
||||
Maaf belum sempat buat untuk _player_ dan _desktop environment_ laen.
|
||||
|
||||
|
||||
Pertanyaan & bugs report ke `https://devilzc0de.org/forum/thread-11791.html`.
|
||||
Pertanyaan & bugs report ke `https://devilzc0de.org/forum/thread-11791.html`.
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
---
|
||||
title: "Devilzc0de Streaming Radio Amarok Script"
|
||||
description: Since I'm the type of person who finds it difficult to work if there are lots of browser tabs open in the browser, I made a simple script so that devilzc0de radio can be listened to via Amarok.
|
||||
summary: Since I'm the type of person who finds it difficult to work if there are lots of browser tabs open in the browser, I made a simple script so that devilzc0de radio can be listened to via Amarok.
|
||||
date: 2011-12-29T03:14:32+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
# -
|
||||
tags:
|
||||
- Amarok
|
||||
- Linux
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
_tested on_ :
|
||||
|
||||
- OS: **Arch Linux** Kernel `3.x` `x86_64`
|
||||
- DE: **KDE** SC `4.7.4`
|
||||
- Qt: `4.8.0`
|
||||
- Source Code : `http://ls-la.ditatompel.crayoncreative.net/linux/devilzc0de_stream.tar.bz2`
|
||||
|
||||
![](dc-amarok2.png#center)
|
||||
|
||||
![](dc-amarok3.png#center)
|
||||
|
||||
![](dc-amarok4.png#center)
|
||||
|
||||
## List Radio Station
|
||||
|
||||
- ainstream
|
||||
- Devilzc0de Radio
|
||||
- Radio Bandung
|
||||
- Prambors FM
|
||||
- Delta FM
|
||||
- Radio Surabaya
|
||||
- Mercury 96FM
|
||||
- Prambors FM
|
||||
- Delta FM
|
||||
- Radio Yogyakarta
|
||||
- Redjo Buntung
|
||||
- Jogjafamily
|
||||
- Swaragama
|
||||
- Female FM
|
||||
- Prambors FM
|
||||
- Radio Semarang
|
||||
- Gajahmada FM
|
||||
- TOP FM Bumiayu
|
||||
- Female FM
|
||||
- Prambos FM
|
||||
- Radio Jakarta
|
||||
- Delta FM
|
||||
- Female FM
|
||||
- Prambors FM
|
||||
- Radio Lainnya
|
||||
- Kaskus Radio
|
||||
- Static Stream Crayon Networks
|
||||
- Lagu Galauers
|
||||
- Instrumental
|
||||
- Latest Song Mix
|
||||
|
||||
## How to Install
|
||||
|
||||
You can install 2 methods, using **Amarok script manager** (_single user_) or manually (_all users_).
|
||||
|
||||
### Using Amarok Script Manager (_single user_)
|
||||
|
||||
1. Open Amarok
|
||||
2. Enter **Settings** -> **Configure Amarok** -> **Script** -> **Manage Scripts**
|
||||
3. Search with _keyword_ **Devilzc0de** -> **Install**
|
||||
|
||||
![](dc-amarok1.png#center)
|
||||
|
||||
### Manual (_all users_)
|
||||
|
||||
```bash
|
||||
wget http://ls-la.ditatompel.crayoncreative.net/linux/devilzc0de_stream.tar.bz2
|
||||
```
|
||||
|
||||
As `root` user, extract then copy the extracted directory to `/usr/share/apps/amarok/scripts/`.
|
||||
|
||||
## How to use
|
||||
|
||||
1. Go to the **internet** menu.
|
||||
2. Select **devilzc0de Radio**.
|
||||
3. Select the radio station you want to listen to.
|
||||
|
||||
Sorry, I haven't had time to create other audio player and desktop environments.
|
||||
|
||||
Questions & bugs report to `https://devilzc0de.org/forum/thread-11791.html`.
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "IDC Indonesia dan Data Center Facebook"
|
||||
description: Kalau dilihat dari segi kemegahan rasanya agak gimana gitu klo membandingkan IDC Indonesia dengan data center sebuah perusahaan (Facebook)
|
||||
description: "Membandingkan IDC Indonesia dengan data center Facebook"
|
||||
summary: "Membandingkan IDC Indonesia dengan data center Facebook"
|
||||
date: 2011-08-20T05:47:30+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
|
@ -9,7 +10,7 @@ featured: false
|
|||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
- TIL
|
||||
tags:
|
||||
|
@ -19,35 +20,25 @@ tags:
|
|||
- IDC Cyber
|
||||
- Datacenter
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Beberapa saat lalu membaca artikel **Robert Scoble** yang mengulas "wisata" nya ke *data center* Facebook. Kalau dilihat dari segi kemegahan rasanya agak gimana gitu klo membandingkan IDC Indonesia dengan *data center* sebuah perusahaan (Facebook).
|
||||
|
||||
<!--more-->
|
||||
Beberapa saat lalu membaca artikel **Robert Scoble** yang mengulas "wisata" nya ke _data center_ Facebook. Kalau dilihat dari segi kemegahan rasanya agak gimana gitu klo membandingkan IDC Indonesia dengan _data center_ sebuah perusahaan (Facebook).
|
||||
|
||||
## IDC Indonesia
|
||||
|
||||
Bisnisnya adalah memberikan pelayanan Data Centre (sesuai namanya) dimana kita bisa simpan server kita pada data centre yang mereka miliki. Banyak pilihan untuk colocation disini, kita bisa sewa space ruangan atau kita hanya sewa 1 rak server ukuran 45u. Sebenernya ada cara lain selain sewa ruangan atau rak server disini, yaitu dengan nebeng dengan yang sudah menyewa rak server atau space ruangan disitu (biasa disebut colocation).
|
||||
|
||||
Indonesia memiliki beberapa pusat *data center* yang terletak di Jakarta, Surabaya, Batam, Makasar, Bandung. Saya sendiri pun hanya pernah mengunjungi IDC Jakarta Cyber (Kuningan, lebih dikenal dengan gedung cyber) dan IDC Jakarta 3D (Duren 3).
|
||||
Indonesia memiliki beberapa pusat _data center_ yang terletak di Jakarta, Surabaya, Batam, Makasar, Bandung. Saya sendiri pun hanya pernah mengunjungi IDC Jakarta Cyber (Kuningan, lebih dikenal dengan gedung cyber) dan IDC Jakarta 3D (Duren 3).
|
||||
|
||||
![](idc-3d-2.jpg#center)
|
||||
|
||||
Yang boleh masuk ke ruangan data centre adalah orang2 dari perusahaan yang telah memiliki kontrak dengan IDC. Semua barang yang ada di data centre di data dengan detil sebagai aset milik perusahaan yang dititipkan di IDC. Semua barang yang masuk ke ruangan *data center* harus tercatat meskipun barang tersebut nantinya akan dibawa keluar lagi.
|
||||
Yang boleh masuk ke ruangan data centre adalah orang2 dari perusahaan yang telah memiliki kontrak dengan IDC. Semua barang yang ada di data centre di data dengan detil sebagai aset milik perusahaan yang dititipkan di IDC. Semua barang yang masuk ke ruangan _data center_ harus tercatat meskipun barang tersebut nantinya akan dibawa keluar lagi.
|
||||
|
||||
![IDC Cyber1](idc-cyber.jpg#center)
|
||||
|
||||
Begitu kita akan masuk ke ruangan *data center*, pintunya tidak akan terbuka apabila kita tidak membawa smart card sebagai passport masuk keruangan tersebut.
|
||||
Begitu kita akan masuk ke ruangan _data center_, pintunya tidak akan terbuka apabila kita tidak membawa smart card sebagai passport masuk keruangan tersebut.
|
||||
|
||||
![IDC 3D](idc-3d.jpg#center)
|
||||
|
||||
|
@ -59,17 +50,17 @@ Ruangan ini dilengkapi dengan AC dan UPS berukuran besar. Semburan angin dingin
|
|||
|
||||
![Facebook Sign](facebook-sign.jpg#center)
|
||||
|
||||
Berikut ini adalah pemandangan yang kita lihat ketika tiba di Facebook *data center*. Sangat **BESAR**!
|
||||
Berikut ini adalah pemandangan yang kita lihat ketika tiba di Facebook _data center_. Sangat **BESAR**!
|
||||
|
||||
![Facebook data center tampak depan](facebook-data-center-pertama-tiba.jpg#center)
|
||||
|
||||
![Gedung data center Facebook](facebook-flag.jpg#center)
|
||||
|
||||
Setelah melewati logo Facebook yang terkesan megah akan tiba di lobi yang menunjukkan keadaan *data center* dan seberapa baik sistem pendingin bekerja:
|
||||
Setelah melewati logo Facebook yang terkesan megah akan tiba di lobi yang menunjukkan keadaan _data center_ dan seberapa baik sistem pendingin bekerja:
|
||||
|
||||
![Monitoring data center dan sistem pendingin facebook](facebook-monitoring-lobby.jpg#center)
|
||||
|
||||
*Data center* Facebook juga memiliki sistem filter dan pendingin udara yang bisa dibilang "gila".
|
||||
_Data center_ Facebook juga memiliki sistem filter dan pendingin udara yang bisa dibilang "gila".
|
||||
|
||||
![Pendingin Udara Facebook](facebook-cooling-air.jpg#center)
|
||||
|
||||
|
@ -79,8 +70,7 @@ Setelah melewati logo Facebook yang terkesan megah akan tiba di lobi yang menunj
|
|||
|
||||
![Facebook Filters 2](facebook-filters2.jpg#center)
|
||||
|
||||
dan akhirnya sampai pada rack *data center* Facebook:
|
||||
|
||||
dan akhirnya sampai pada rack _data center_ Facebook:
|
||||
|
||||
![Facebook Filters 2](facebook-racks.jpg#center)
|
||||
|
||||
|
@ -89,5 +79,7 @@ dan akhirnya sampai pada rack *data center* Facebook:
|
|||
![Facebook Filters 2](facebook-racks3.jpg#center)
|
||||
|
||||
## Sumber
|
||||
* [http://scobleizer.com/2011/04/16/photo-tour-of-facebooks-new-datacenter/](http://scobleizer.com/2011/04/16/photo-tour-of-facebooks-new-datacenter/)
|
||||
* [http://www.idc.co.id/](http://www.idc.co.id/)
|
||||
|
||||
- [http://scobleizer.com/2011/04/16/photo-tour-of-facebooks-new-datacenter/](http://scobleizer.com/2011/04/16/photo-tour-of-facebooks-new-datacenter/)
|
||||
- [http://www.idc.co.id/](http://www.idc.co.id/)
|
||||
|
||||
|
|
84
content/blog/idc-indonesia-dan-data-center-facebook/index.md
Normal file
84
content/blog/idc-indonesia-dan-data-center-facebook/index.md
Normal file
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
title: "IDC Indonesia and Facebook's Data Centre"
|
||||
description: "Comparing IDC Indonesia with Facebook's data centre."
|
||||
summary: "Comparing IDC Indonesia with Facebook's data centre."
|
||||
date: 2011-08-20T05:47:30+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
- TIL
|
||||
tags:
|
||||
- Facebook
|
||||
- Indonesia data centre
|
||||
- IDC 3D
|
||||
- IDC Cyber
|
||||
- Datacenter
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Recently, I was reading an article by **Robert Scoble** about his "tour" of Facebook's data centre. If we look at it from a grandiose perspective, it seems quite impressive when compared to IDC Indonesia's data centre for a company (Facebook).
|
||||
|
||||
## IDC Indonesia
|
||||
|
||||
Their business involves providing data centre services, where customers can store their servers within their facilities. There are various options for colocation, including renting a room or a 45U server rack. Alternatively, one can share a server rack or space with another company that has already rented a server rack or space (commonly referred to as colocation).
|
||||
|
||||
Indonesia has several data centre locations across the country, including Jakarta, Surabaya, Batam, Makasar, and Bandung. Personally, I have only visited IDC Jakarta Cyber (Kuningan, also known as the cyber building) and IDC Jakarta 3D (Duren Tiga).
|
||||
|
||||
![IDC 3D](idc-3d-2.jpg#center)
|
||||
|
||||
Only individuals from companies that have contracts with IDC are authorized to enter the data centre. All items within the data centre are meticulously catalogued as assets belonging to the company that has entrusted them to IDC. Any item entering or leaving the data centre must be recorded, regardless of whether it will eventually be removed.
|
||||
|
||||
![IDC Cyber1](idc-cyber.jpg#center)
|
||||
|
||||
When we enter the data centre, the door will not open unless we possess a smart card as our access key to that area.
|
||||
|
||||
![IDC 3D](idc-3d.jpg#center)
|
||||
|
||||
This room is equipped with large air conditioning (AC) and uninterruptible power supply (UPS) units. The cool air circulation produced by the AC was designed to circulate hot air emitted by the machines in the room, ensuring a comfortable working environment.
|
||||
|
||||
![IDC Cyber Rooftop](idc-cyber-roof.jpg#center)
|
||||
|
||||
## Facebook's data centre
|
||||
|
||||
![Facebook Sign](facebook-sign.jpg#center)
|
||||
|
||||
The following is what you see when you arrive at Facebook's data centre. It's MASSIVE!
|
||||
|
||||
![Front view of Facebook data centre](facebook-data-center-pertama-tiba.jpg#center)
|
||||
|
||||
![Facebook data centre building](facebook-flag.jpg#center)
|
||||
|
||||
After passing by the massive Facebook logo, you'll arrive at a lobby that displays the condition of the data centre and the performance of the cooling system:
|
||||
|
||||
![Monitoring data centre and Facebook cooling system](facebook-monitoring-lobby.jpg#center)
|
||||
|
||||
Facebook's data centre also features air filters and cooling systems that can be described as "crazy".
|
||||
|
||||
![Facebook Cooling Air](facebook-cooling-air.jpg#center)
|
||||
|
||||
![Facebook Fan (Cooling System)](facebook-fan.jpg#center)
|
||||
|
||||
![Facebook Filters](facebook-filters.jpg#center)
|
||||
|
||||
![Facebook Filters 2](facebook-filters2.jpg#center)
|
||||
|
||||
And finally, we arrive at Facebook's data centre rack:
|
||||
|
||||
![Facebook Racks](facebook-racks.jpg#center)
|
||||
|
||||
![Facebook Racks 2](facebook-racks2.jpg#center)
|
||||
|
||||
![Facebook Racks 2](facebook-racks3.jpg#center)
|
||||
|
||||
## Sources
|
||||
|
||||
- [http://scobleizer.com/2011/04/16/photo-tour-of-facebooks-new-datacenter/](http://scobleizer.com/2011/04/16/photo-tour-of-facebooks-new-datacenter/)
|
||||
- [http://www.idc.co.id/](http://www.idc.co.id/)
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Koneksi Ke Internet Modem Smart ZTE AC2726i pada Linux"
|
||||
description: "Berikut ini adalah tutorial untuk melakukan koneksi ke internet dengan modem Smart Fren ZTE AC2726i (Dual Mode USB Modem) menggunakan wvdial."
|
||||
description: "Tutorial untuk melakukan koneksi ke internet dengan modem Smart Fren ZTE AC2726i (Dual Mode USB Modem) menggunakan wvdial."
|
||||
summary: "Tutorial untuk melakukan koneksi ke internet dengan modem Smart Fren ZTE AC2726i (Dual Mode USB Modem) menggunakan wvdial."
|
||||
date: 2012-09-08T19:40:46+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
|
@ -9,44 +10,34 @@ featured: false
|
|||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
# -
|
||||
# -
|
||||
tags:
|
||||
- BackTrack
|
||||
- wvdial
|
||||
- Linux
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Berikut ini adalah tutorial untuk melakukan koneksi ke internet dengan modem **Smart Fren ZTE AC2726i** atau **ZTE AC2726** (*Dual Mode USB Modem*) menggunakan `wvdial`.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Pada saat tutorial ini dibuat Saya menggunakan Distro **BackTrack**. Dan harusnya dapat bekerja juga di distro **Linux** lainnya.
|
||||
|
||||
Pertama, Anda harus [mendownload terlebih dahulu `usb_modeswitch`](https://www.draisberghof.de/usb_modeswitch/#download). Jika anda sudah memiliki koneksi internet (dengan **WiFi** misalnya), Anda cukup menjalankan perintah `wget` :
|
||||
|
||||
```bash
|
||||
wget https://www.draisberghof.de/usb_modeswitch/usb_modeswitch-1.0.2.tar.bz2
|
||||
```
|
||||
|
||||
Setelah proses mendownload selesai, *extract* `usb_modeswitch-1.0.2.tar.bz2` yang baru saja Anda download.
|
||||
Setelah proses mendownload selesai, _extract_ `usb_modeswitch-1.0.2.tar.bz2` yang baru saja Anda download.
|
||||
|
||||
```bash
|
||||
tar -xjf usb_modeswitch-1.0.2.tar.bz2
|
||||
```
|
||||
|
||||
Masuk ke folder `usb_modeswitch-1.0.2` dan install :
|
||||
|
||||
```bash
|
||||
cd usb_modeswitch-1.0.2; sudo make install
|
||||
```
|
||||
|
@ -60,11 +51,15 @@ install ./usb_modeswitch /usr/sbin
|
|||
mkdir -p /etc
|
||||
install ./usb_modeswitch.conf /etc
|
||||
```
|
||||
|
||||
Terlihat bahwa ada 2 file terinstall : `usb_modeswitch` dan `usb_modeswitch.conf`. Edit `usb_modeswitch.conf` yang terletak pada folder `/etc`.
|
||||
|
||||
```bash
|
||||
sudo nano /etc/usb_modeswitch.conf
|
||||
```
|
||||
|
||||
tambahkan konfigurasi berikut yang mirip dengan konfigurasi modem **ZTE AC2710** (**EVDO**) oleh **Wasim Baig**
|
||||
|
||||
```plain
|
||||
#########################################################
|
||||
## ZTE AC2726i (EVDO)
|
||||
|
@ -74,12 +69,17 @@ TargetVendor= 0x19d2
|
|||
TargetProduct= 0xfff1
|
||||
MessageContent= "5553424312345678c00000008000069f010000000000000000000000000000"
|
||||
```
|
||||
|
||||
Kemudian buka konfigurasi `wvdial` pada `/etc/wvdial.conf` dan edit file konfigurasinya :
|
||||
> _* Saya sarankan untuk selalu membackup konfigurasi anda sebelum melakukan modifikasi._
|
||||
|
||||
> _\* Saya sarankan untuk selalu membackup konfigurasi anda sebelum melakukan modifikasi._
|
||||
|
||||
```bash
|
||||
sudo nano /etc/wvdial.conf
|
||||
```
|
||||
|
||||
Tambahkan konfigurasi berikut ini :
|
||||
|
||||
```plain
|
||||
[Dialer smart]
|
||||
Init1 = ATZ
|
||||
|
@ -99,21 +99,21 @@ Baud = 9600
|
|||
Konfigurasi usb_modeswitch dan wvdial telah selesai.
|
||||
|
||||
Jalankan `usb_modeswitch` dari terminal untuk merubah product usb modem dari `fff5` ke `fff1`.
|
||||
|
||||
```bash
|
||||
usb_modeswitch
|
||||
```
|
||||
|
||||
Kemudian langkah selanjutnya yang perlu kita lakukan adalah mendeteksi **product id** dari modem yang kita gunakan:
|
||||
|
||||
```bash
|
||||
sudo modprobe usbserial vendor=0x19d2 product=0xfff1
|
||||
```
|
||||
|
||||
Terakhir jalankan perintah `wvdial`:
|
||||
|
||||
```bash
|
||||
sudo wvdial smart
|
||||
```
|
||||
|
||||
![wvdial Smart Fren](connect-internet-wvdial.png)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
---
|
||||
title: "Connect to the Internet Using ZTE AC2726i Smart Modem on Linux"
|
||||
description: "Tutorial for connecting to the internet with the ZTE AC2726i Smart Fren modem (dual-mode USB modem) using wvdial."
|
||||
summary: "Tutorial for connecting to the internet with the ZTE AC2726i Smart Fren modem (dual-mode USB modem) using wvdial."
|
||||
date: 2012-09-08T19:40:46+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
# -
|
||||
tags:
|
||||
- BackTrack
|
||||
- wvdial
|
||||
- Linux
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
When this tutorial was created, I used the **BackTrack** distribution. And it should work on other **Linux** distributions too.
|
||||
|
||||
First, you need to [download `usb_modeswitch`](https://www.draisberghof.de/usb_modeswitch/#download). If you already have an internet connection (with **Wi-Fi**, for example), you can simply run the `wget` command:
|
||||
|
||||
```bash
|
||||
wget https://www.draisberghof.de/usb_modeswitch/usb_modeswitch-1.0.2.tar.bz2
|
||||
```
|
||||
|
||||
After the download process is complete, extract `usb_modeswitch-1.0.2.tar.bz2`, which you just downloaded.
|
||||
|
||||
```bash
|
||||
tar -xjf usb_modeswitch-1.0.2.tar.bz2
|
||||
```
|
||||
|
||||
Go to the `usb_modeswitch-1.0.2` directory and install:
|
||||
|
||||
```bash
|
||||
cd usb_modeswitch-1.0.2; sudo make install
|
||||
```
|
||||
|
||||
and you will get output similar like this:
|
||||
|
||||
```plain
|
||||
[sudo] password for ditatompel:
|
||||
mkdir -p /usr/sbin
|
||||
install ./usb_modeswitch /usr/sbin
|
||||
mkdir -p /etc
|
||||
install ./usb_modeswitch.conf /etc
|
||||
```
|
||||
|
||||
It can be seen that two files have been installed: `usb_modeswitch` and `usb_modeswitch.conf`. Edit `usb_modeswitch.conf`, which is located in the `/etc` directory.
|
||||
|
||||
```bash
|
||||
sudo nano /etc/usb_modeswitch.conf
|
||||
```
|
||||
|
||||
Add the following configuration, which is similar to **ZTE AC2710** (**EVDO**) modem configurations by **Wasim Baig**:
|
||||
|
||||
```plain
|
||||
#########################################################
|
||||
## ZTE AC2726i (EVDO)
|
||||
DefaultVendor= 0x19d2
|
||||
DefaultProduct= 0xfff5
|
||||
TargetVendor= 0x19d2
|
||||
TargetProduct= 0xfff1
|
||||
MessageContent= "5553424312345678c00000008000069f010000000000000000000000000000"
|
||||
```
|
||||
|
||||
Then, open the `wvdial` configuration in `/etc/wvdial.conf` and edit the configuration file:
|
||||
|
||||
> _\* I recommend always backing up your configuration before making changes._
|
||||
|
||||
```bash
|
||||
sudo nano /etc/wvdial.conf
|
||||
```
|
||||
|
||||
Add the following configuration:
|
||||
|
||||
```plain
|
||||
[Dialer smart]
|
||||
Init1 = ATZ
|
||||
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
|
||||
Modem Type = USB Modem
|
||||
ISDN = 0
|
||||
New PPPD = yes
|
||||
Phone = #777
|
||||
Modem = /dev/ttyUSB0
|
||||
Username = smart
|
||||
Password = smart
|
||||
FlowControl = CRTSCTS
|
||||
Carrier Check = No
|
||||
Baud = 9600
|
||||
```
|
||||
|
||||
The `usb_modeswitch` and `wvdial` configuration has been completed.
|
||||
|
||||
Run `usb_modeswitch` from the terminal to change the USB modem product from `fff5` to `fff1`.
|
||||
|
||||
```bash
|
||||
usb_modeswitch
|
||||
```
|
||||
|
||||
Then, the next step we need to do is detect the **product ID** of the modem we are using:
|
||||
|
||||
```bash
|
||||
sudo modprobe usbserial vendor=0x19d2 product=0xfff1
|
||||
```
|
||||
|
||||
Finally, run the `wvdial` command:
|
||||
|
||||
```bash
|
||||
sudo wvdial smart
|
||||
```
|
||||
|
||||
![wvdial Smart Fren](connect-internet-wvdial.png)
|
|
@ -5,8 +5,8 @@ date: 2023-06-04T01:19:36+07:00
|
|||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: true
|
||||
pinned: false
|
||||
featured: false
|
||||
pinned: true
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
|
@ -211,4 +211,3 @@ Kita juga berharap bahwa teknologi **QUIC/HTTP3** segera masuk ke babak baru yan
|
|||
- Moh. Khory Alfarizi, Febriyan, "[Survei Indikator Politik Indonesia: 62,9 Persen Rakyat Semakin Takut Berpendapat](https://nasional.tempo.co/read/1580168/survei-indikator-politik-indonesia-629-persen-rakyat-semakin-takut-berpendapat)" - tempo.co .
|
||||
- Abba Gabrillin, Krisiandi, "[Selama 2018, Polisi Tangkap 122 Orang Terkait Ujaran Kebencian di Medsos](https://nasional.kompas.com/read/2019/02/15/15471281/selama-2018-polisi-tangkap-122-orang-terkait-ujaran-kebencian-di-medsos)" - kompas.com.
|
||||
- Tsarina Maharani, Dani Prabowo "[Kontras: Polisi Siber yang Akan Diaktifkan Pemerintah Berpotensi Bungkam Kebebasan Berekspresi](https://nasional.kompas.com/read/2020/12/28/14074121/kontras-polisi-siber-yang-akan-diaktifkan-pemerintah-berpotensi-bungkam)" - kompas.com.
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Pelajaran Dari MyBB FB Connect Plugin XSS Attack"
|
||||
description: Artikel ini bertujuan untuk sharing pengetahuan bagaimana cara backtracking attacker, khususnya yang memanfaatkan aplikasi Facebook.
|
||||
summary: Artikel ini bertujuan untuk sharing pengetahuan bagaimana cara backtracking attacker, khususnya yang memanfaatkan aplikasi Facebook.
|
||||
date: 2011-12-01T23:53:39+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
|
@ -9,7 +10,7 @@ featured: false
|
|||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
- Security
|
||||
- Privasi
|
||||
|
@ -19,32 +20,21 @@ tags:
|
|||
- XSS
|
||||
- Facebook
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Beberapa waktu lalu, saya kaget belakangan ini ketika saya lihat logs situs saya yang penuh dengan uji coba *security* dari **IP** Indonesia. Salah satunya **XSS** pada **MyBB Plugin** di salah *forum* saya. Artikel ini bertujuan untuk sharing pengetahuan saja bagaimana cara *'backtracking'* *attacker*, khususnya yang memanfaatkan aplikasi Facebook.
|
||||
|
||||
<!--more-->
|
||||
Beberapa waktu lalu, saya kaget belakangan ini ketika saya lihat logs situs saya yang penuh dengan uji coba _security_ dari **IP** Indonesia. Salah satunya **XSS** pada **MyBB Plugin** di salah _forum_ saya. Artikel ini bertujuan untuk sharing pengetahuan saja bagaimana cara _'backtracking'_ _attacker_, khususnya yang memanfaatkan aplikasi Facebook.
|
||||
|
||||
> _**CATATAN**: pada artikel ini saya tidak menggunakan ID Facebook attacker yang sebenarnya karena saya menghargai sang attacker dan guide ini hanya untuk sharing pengetahuan saja._
|
||||
|
||||
Seperti apa yang sudah diinformasikan oleh om **badwolves1986** di `http://devilzc0de.org/forum/thread-11110.html` bahwa ada **XSS bug** pada **plugin fbconnect** untuk **MyBB** tersebut.
|
||||
|
||||
Begitu mengetahui bugs tersebut, saya memang belum sempat *'menutup'* celah2nya. Saya hanya sempat menambahkan *"permission tambahan"* pada plugin tersebut yang membuat saya **BERHAK** melakukan update status akun Facebook yang digunakan untuk registrasi. Perhatikan gambar di bawah ini :
|
||||
Begitu mengetahui bugs tersebut, saya memang belum sempat _'menutup'_ celah2nya. Saya hanya sempat menambahkan _"permission tambahan"_ pada plugin tersebut yang membuat saya **BERHAK** melakukan update status akun Facebook yang digunakan untuk registrasi. Perhatikan gambar di bawah ini :
|
||||
|
||||
![FB Connect Permission Request](fbconnect-xss1.jpg#center)
|
||||
|
||||
Dari situ bisa dilihat bahwa aplikasi yang digunakan meminta permission lebih, yaitu : *"Post to Facebook as Me"* dan *"Access my data anytime"* setra beberapa data lainnya.
|
||||
Dari situ bisa dilihat bahwa aplikasi yang digunakan meminta permission lebih, yaitu : _"Post to Facebook as Me"_ dan _"Access my data anytime"_ setra beberapa data lainnya.
|
||||
|
||||
Dan dari sini kita bisa mendapatkan data2 attacker. Mari kita lihat pada database :
|
||||
|
||||
|
@ -54,7 +44,7 @@ SELECT uid, username, fbuid FROM [namatableuserforumanda] WHERE uid = '[uidattac
|
|||
|
||||
Perlu diingat bahwa field `fbuid` akan otomatis ada jika anda menginstall **FB Connect Plugin** untuk **MyBB**.
|
||||
|
||||
Dari *query* tersebut kita mendapatkan **user ID Facebook Attacker**.
|
||||
Dari _query_ tersebut kita mendapatkan **user ID Facebook Attacker**.
|
||||
|
||||
![Hasil QUery SQL](fbconnect-xss2.jpg#center)
|
||||
|
||||
|
@ -67,7 +57,7 @@ Benar sekali, **Facebook API**!
|
|||
|
||||
Kita bisa memanfaatkan **PHP Facebook SDK** dari [https://github.com/facebook/php-sdk](https://github.com/facebook/php-sdk).
|
||||
|
||||
Setelah didownload dan diupload ke webserver, mari kita buat *script* sederhana agar kita dapat melakukan update status profile Facebook attacker tersebut.
|
||||
Setelah didownload dan diupload ke webserver, mari kita buat _script_ sederhana agar kita dapat melakukan update status profile Facebook attacker tersebut.
|
||||
|
||||
![PHP Facebook SDK](fbconnect-xss3.jpg#center)
|
||||
|
||||
|
@ -97,12 +87,13 @@ echo $fbinfo;
|
|||
?>
|
||||
```
|
||||
|
||||
Setelah itu upload ke situs anda dan eksekusi *script* tersebut. Maka anda telah berhasil melakukan update status pada akun Facebook attacker anda.
|
||||
Setelah itu upload ke situs anda dan eksekusi _script_ tersebut. Maka anda telah berhasil melakukan update status pada akun Facebook attacker anda.
|
||||
|
||||
![Post menggunakan Facebook API](fbconnect-xss4.jpg#center)
|
||||
|
||||
Dari sini kita belajar beberapa hal:
|
||||
1. *Covering track* itu perlu pada saat melakukan penyerangan sebuah situs.
|
||||
|
||||
1. _Covering track_ itu perlu pada saat melakukan penyerangan sebuah situs.
|
||||
2. Jangan gunakan ID / Identitas keseharian anda pada saat melakukan testing.
|
||||
|
||||
Lalu, kalau sudah terlanjur memperbolehkan aplikasi tersebut untuk mengakses data2 ane gimana om?
|
||||
|
@ -111,6 +102,7 @@ Masuk ke `http://www.facebook.com/settings/?tab=privacy`, lalu pilih **"Edit Set
|
|||
|
||||
Nah pada menu **"Apps you use"** ente bisa hapus aplikasi2 yang sekiranya tidak diperlukan.
|
||||
|
||||
buat yg ingin *anonymous*, hati2 dengan Facebook karena dia benar2 mengoleksi data-data kita.
|
||||
buat yg ingin _anonymous_, hati2 dengan Facebook karena dia benar2 mengoleksi data-data kita.
|
||||
|
||||
> _Jangan lupa, selalu gunakan 'pengaman' saat melakukan adegan berbahaya.._
|
||||
|
||||
> _Jangan lupa, selalu gunakan 'pengaman' saat melakukan adegan berbahaya.._
|
|
@ -0,0 +1,105 @@
|
|||
---
|
||||
title: "Lessons from MyBB FB Connect Plugin XSS Attack"
|
||||
description: This article aims to share knowledge on how to counter-attack against attackers, specifically those using third-party Facebook applications.
|
||||
summary: This article aims to share knowledge on how to counter-attack against attackers, specifically those using third-party Facebook applications.
|
||||
date: 2011-12-01T23:53:39+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
- Security
|
||||
- Privasi
|
||||
- TIL
|
||||
tags:
|
||||
- MyBB
|
||||
- XSS
|
||||
- Facebook
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
A few days ago, I was surprised to see that my website's logs were filled with security testing attempts originating from an IP address in Indonesia. One of these attempts was a successful XSS attack targeting the MyBB plugin within one of my online forums.
|
||||
|
||||
> _**NOTICE**: In this article, I will not use the actual Facebook attacker's ID and this guide is only for sharing knowledge._
|
||||
|
||||
As mentioned by **@badwolves1986** at `http://devilzc0de.org/forum/thread-11110.html`, there was a **XSS bug** in the **plugin fbconnect** for **MyBB**.
|
||||
|
||||
When I discovered the bug, I didn't manage to _'patch'_ the bugs. I only managed to add _"additional permissions"_ to the plugin, which allowed me to update Facebook account status used for registration. Note the image below:
|
||||
|
||||
![FB Connect Permission Request](fbconnect-xss1.jpg#center)
|
||||
|
||||
From there, we can get the attacker's data. Let's look at the database:
|
||||
|
||||
```bash
|
||||
SELECT uid, username, fbuid FROM [usertable] WHERE uid = '[uidattacker]'
|
||||
```
|
||||
|
||||
Please note that the `fbuid` field will automatically exist if you install **FB Connect Plugin** for **MyBB**.
|
||||
|
||||
From the query above, we get the **Facebook Attacker's User ID**.
|
||||
|
||||
![SQL Query Result](fbconnect-xss2.jpg#center)
|
||||
|
||||
What can we do next? Let's recap again...
|
||||
|
||||
1. We already have Facebook attacker's user ID.
|
||||
2. We already have permission to update status and access data for that user ID, even when offline!
|
||||
|
||||
That's right, **Facebook API**!
|
||||
|
||||
We can utilize **PHP Facebook SDK** from [https://github.com/facebook/php-sdk](https://github.com/facebook/php-sdk).
|
||||
|
||||
After downloading and uploading it to the web server, let's create a simple script to update the attacker's profile status.
|
||||
|
||||
![PHP Facebook SDK](fbconnect-xss3.jpg#center)
|
||||
|
||||
Here is an example of the code:
|
||||
|
||||
```php
|
||||
<?php
|
||||
require 'location-pf-facebook-sdk.php';
|
||||
/**
|
||||
* Facebook
|
||||
*/
|
||||
$app_id = "[your-app-id]";
|
||||
$app_secret = "[your-app-secret]";
|
||||
|
||||
//build content
|
||||
$fbinfo = 'Your message';
|
||||
$facebook = new Facebook(array(
|
||||
'appId' => $app_id,
|
||||
'secret' => $app_secret
|
||||
));
|
||||
$response = $facebook->api(array(
|
||||
'method' => 'stream.publish',
|
||||
'uid' => '[attacker-user-id-from-the-database]',
|
||||
'message' => $fbinfo
|
||||
));
|
||||
echo $fbinfo;
|
||||
?>
|
||||
```
|
||||
|
||||
After that, upload it to your site and execute the script. Then, you will have successfully updated the Facebook attacker's account status.
|
||||
|
||||
![Posting using Facebook API](fbconnect-xss4.jpg#center)
|
||||
|
||||
From here, we learn a few things:
|
||||
|
||||
1. _Covering tracks_ are necessary when performing attacks on a website.
|
||||
2. Do not use your real identity during illegal penetration testing.
|
||||
|
||||
What if I've already given an app permission to access my data?
|
||||
|
||||
Log in to `http://www.facebook.com/settings/?tab=privacy`, then select **"Edit Settings"** under the **Apps and Websites** menu.
|
||||
|
||||
In the **"Apps you use"** menu, you can revoke or remove unnecessary apps.
|
||||
|
||||
For those who want to remain _anonymous_, be cautious with Facebook, as it truly collects our data.
|
||||
|
||||
> _Don't forget, always use 'extra protection' when performing illegal activities.._
|
|
@ -1,44 +1,34 @@
|
|||
---
|
||||
title: "PHP E-Mail Advanced Validation (Format, MX Host, SMTP Mailbox)"
|
||||
description: "Sebuah script PHP sederhana untuk melakukan validasi E-Mail melalui format penulisan, MX record, dan SMTP mailbox."
|
||||
summary: "Sebuah script PHP sederhana untuk melakukan validasi E-Mail melalui format penulisan, MX record, dan SMTP mailbox."
|
||||
date: 2012-10-14T20:02:21+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
- Programming
|
||||
tags:
|
||||
- PHP
|
||||
images:
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Tidak bisa dipungkiri lagi jika di internet, keberadaan **E-Mail** sangatlah penting. Dengan adanya E-Mail, informasi dapat sangat cepat sampai meskipun sang pengirim dan penerima berada di dua benua yang berbeda. Selain itu, email juga masih menjadi pilihan perusahaan dan developer untuk menyampaikan informasi kepada para pelanggannya.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Kali ini ijinkan saya untuk berbagi sebuah *script* **PHP** sederhana untuk melakukan validasi E-Mail melalui format penulisan, **MX record**, dan **SMTP mailbox**.
|
||||
Kali ini ijinkan saya untuk berbagi sebuah _script_ **PHP** sederhana untuk melakukan validasi E-Mail melalui format penulisan, **MX record**, dan **SMTP mailbox**.
|
||||
|
||||
Untuk validasi alamat E-Mail, kita dapat melakukan beberapa hal. yaitu dari format penulisan email, melakukan pengecekan atas **MX record** pada domain yang ingin di cek, atau bahkan melakukan koneksi ke SMTP server yang dituju untuk melakukan pengecekan keberadaan user yang dituju.
|
||||
|
||||
Source code dapat didownload di `http://go.webdatasolusindo.co.id/scripts/php/email-advanced-validation.php` atau di `http://pastebin.com/yyjChgKF`.
|
||||
|
||||
## 1. Validasi Format Email
|
||||
|
||||
Format email yang sering digunakan adalah seperti berikut :
|
||||
`username@domain.com`
|
||||
`Username` : nama user yang dituju.
|
||||
|
@ -49,6 +39,7 @@ Kelemahan pada validasi format seperti ini adalah kita tidak tahu apakah domain
|
|||
Untuk memastikan bahwa domain tersebut valid atau tidak, kita dapat melakukan pengecekan melalui **MX record**.
|
||||
|
||||
## 2. Validasi MX Record
|
||||
|
||||
Fungsi **MX Record** biasa digunakan untuk mendelegasikan email untuk suatu domain / host ke mail server yang dituju. (Baca : [Sistem penamaan domain](https://id.wikipedia.org/wiki/Sistem_Penamaan_Domain) agar lebih jelas)
|
||||
|
||||
Contohnya dengan menjalankan perintah `dig wds.co.id MX +short`:
|
||||
|
@ -65,14 +56,15 @@ Contohnya dengan menjalankan perintah `dig wds.co.id MX +short`:
|
|||
|
||||
Maka akan terlihat **MX Record** untuk domain `wds.co.id`.
|
||||
|
||||
Dengan melakukan *query* **MX record** tersebut, bisa dikatakan bahwa domain tersebut merupakan domain yang memungkinkan memiliki alamat email. Sedangkan kelemahan pada validasi melalui MX record adalah kita tidak tahu apakah user pada domain tersebut benar-benar ada.
|
||||
Dengan melakukan _query_ **MX record** tersebut, bisa dikatakan bahwa domain tersebut merupakan domain yang memungkinkan memiliki alamat email. Sedangkan kelemahan pada validasi melalui MX record adalah kita tidak tahu apakah user pada domain tersebut benar-benar ada.
|
||||
|
||||
Misalnya alamat email `alamat.palsu@wds.co.id` akan dikatakan valid meskipun sebenarnya user alamat palsu tidak benar-benar ada pada mail server yang dituju.
|
||||
|
||||
Untuk dapat mengetahui user benar-benar ada pada mail server yang dituju, kita dapat mengembangkannya lagi dengan melakukan koneksi ke **SMTP** server yang dituju.
|
||||
|
||||
## 3. Validasi SMTP mailbox
|
||||
Dengan melakukan koneksi ke **SMTP** server, kita dapat mengetahui apakah user pada domain tersebut benar-benar ada atau tidak. Contohnya saya melakukan `telnet` ke port `25` (*default port SMTP*) dan menjalankan perintah-perintah **SMTP**.
|
||||
|
||||
Dengan melakukan koneksi ke **SMTP** server, kita dapat mengetahui apakah user pada domain tersebut benar-benar ada atau tidak. Contohnya saya melakukan `telnet` ke port `25` (_default port SMTP_) dan menjalankan perintah-perintah **SMTP**.
|
||||
|
||||
```plain
|
||||
dit@tompel ~ $ telnet aspmx3.googlemail.com 25
|
||||
|
@ -111,19 +103,23 @@ Connection closed by foreign host.
|
|||
![SMTP commands](php-email-telnetsmtp.png#center)
|
||||
|
||||
Perhatikan pada koneksi telnet pertama :
|
||||
|
||||
```plain
|
||||
RCPT TO: <christian.dita@wds.co.id>
|
||||
250 2.1.5 OK c2si11647357yhk.33
|
||||
```
|
||||
|
||||
dan koneksi telnet kedua :
|
||||
|
||||
```plain
|
||||
RCPT TO: <alamat.palsu@wds.co.id>
|
||||
550-5.1.1 The email account that you tried to reach does not exist. [ Blah blah blah... ]
|
||||
```
|
||||
|
||||
Pada koneksi pertama, terlihat bahwa *respond* mail server mau menerima email untuk recipient yg dituju.
|
||||
Pada koneksi pertama, terlihat bahwa _respond_ mail server mau menerima email untuk recipient yg dituju.
|
||||
Sedangkan pada koneksi kedua, mail server tidak mau menerima email untuk recipient yg dituju.
|
||||
|
||||
Jadi bisa dikatakan bahwa user `alamat.palsu` pada domain `wds.co.id` tidak benar-benar ada.
|
||||
|
||||
Dari ke 3 validasi di atas itulah konsep dasar darp script **PHP E-Mail Advanced Validation** ini saya buat.
|
||||
Dari ke 3 validasi di atas itulah konsep dasar darp script **PHP E-Mail Advanced Validation** ini saya buat.
|
||||
|
||||
|
|
|
@ -0,0 +1,122 @@
|
|||
---
|
||||
title: "PHP Email Advanced Validation (Format, MX Host, SMTP Mailbox)"
|
||||
description: "A simple PHP script for validating email addresses using format, MX record, and SMTP mailbox checks."
|
||||
summary: "A simple PHP script for validating email addresses using format, MX record, and SMTP mailbox checks."
|
||||
date: 2012-10-14T20:02:21+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: false
|
||||
pinned: false
|
||||
series:
|
||||
# -
|
||||
categories:
|
||||
- Programming
|
||||
tags:
|
||||
- PHP
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
It cannot be denied that on the internet, the existence of email is very important. With email, information can arrive very quickly even if the sender and recipient are on two different continents. Apart from that, email remains a popular choice for companies and developers to convey information to their customers.
|
||||
|
||||
This time, I'd like to share a simple PHP script to validate email addresses via writing format, MX record, and SMTP mailbox checks.
|
||||
|
||||
To validate an email address, we can do several things. Specifically, this involves checking the email's writing format, verifying the MX record on the domain you want to check, or even connecting to the destination SMTP server to determine the target user's whereabouts.
|
||||
|
||||
The source code is available for download at `http://go.webdatasolusindo.co.id/scripts/php/email-advanced-validation.php` or at `http://pastebin.com/yyjChgKF`.
|
||||
|
||||
## 1. Validate Email Format
|
||||
|
||||
The email format commonly used is as follows:
|
||||
|
||||
- `username@domain.com`
|
||||
- `Username`: the intended recipient's name.
|
||||
- `domain.com`: the domain name where the user is located.
|
||||
|
||||
However, this format validation has a weakness: we don't know whether the domain actually hosts a mail server. For instance, the email address `username@domaininvalid.com` will be considered valid, even though the domain does not exist. To ensure the domain's validity or nonexistence, we can check via the MX record.
|
||||
|
||||
## 2. Validate MX Records
|
||||
|
||||
The MX Record function typically delegates email for a domain/host to its destination mail server.
|
||||
|
||||
For example, running the command `dig wds.co.id MX +short`:
|
||||
|
||||
```plain
|
||||
30 aspmx3.googlemail.com.
|
||||
0 aspmx.l.google.com.
|
||||
10 alt1.aspmx.l.google.com.
|
||||
20 alt2.aspmx.l.google.com.
|
||||
30 aspmx2.googlemail.com.
|
||||
```
|
||||
|
||||
![dig record](php-email-dig_mxrecord.png#center)
|
||||
|
||||
This will display the MX Record for the domain `wds.co.id`.
|
||||
|
||||
By querying the MX record, it can be concluded that this domain allows email addresses. However, this validation has a weakness: we don't know whether the user on the domain actually exists.
|
||||
|
||||
For instance, the email address `fake.account@wds.co.id` will be considered valid even though the fake account does not exist on the targeted mail server.
|
||||
|
||||
To determine the user's actual existence, we can further develop this by connecting to the destination SMTP server.
|
||||
|
||||
## 3. Validate SMTP Mailbox
|
||||
|
||||
By connecting to the SMTP server, we can determine whether the user on the domain actually exists or not. For example, I use `telnet` to connect to port `25` (the default SMTP port) and execute SMTP commands.
|
||||
|
||||
```plain
|
||||
dit@tompel ~ $ telnet aspmx3.googlemail.com 25
|
||||
Trying 74.125.137.26...
|
||||
Connected to aspmx3.googlemail.com.
|
||||
Escape character is '^]'.
|
||||
220 mx.google.com ESMTP c2si11647357yhk.33
|
||||
HELO aspmx3.googlemail.com
|
||||
250 mx.google.com at your service
|
||||
MAIL FROM: <ditatompel@devilzc0de.org>
|
||||
250 2.1.0 OK c2si11647357yhk.33
|
||||
RCPT TO: <christian.dita@wds.co.id>
|
||||
250 2.1.5 OK c2si11647357yhk.33
|
||||
QUIT
|
||||
221 2.0.0 closing connection c2si11647357yhk.33
|
||||
Connection closed by foreign host.
|
||||
dit@tompel ~ $ telnet aspmx3.googlemail.com 25
|
||||
Trying 74.125.137.26...
|
||||
Connected to aspmx3.googlemail.com.
|
||||
Escape character is '^]'.
|
||||
220 mx.google.com ESMTP w4si11351321yhd.42
|
||||
HELO aspmx3.googlemail.com
|
||||
250 mx.google.com at your service
|
||||
MAIL FROM: <ditatompel@devilzc0de.org>
|
||||
250 2.1.0 OK w4si11351321yhd.42
|
||||
RCPT TO: <fake.account@wds.co.id>
|
||||
550-5.1.1 The email account that you tried to reach does not exist. Please try
|
||||
550-5.1.1 double-checking the recipient's email address for typos or
|
||||
550-5.1.1 unnecessary spaces. Learn more at
|
||||
550 5.1.1 http://support.google.com/mail/bin/answer.py?answer=6596 w4si11351321yhd.42
|
||||
QUIT
|
||||
221 2.0.0 closing connection w4si11351321yhd.42
|
||||
Connection closed by foreign host.
|
||||
```
|
||||
|
||||
![SMTP commands](php-email-telnetsmtp.png#center)
|
||||
|
||||
Pay attention to the initial telnet connection:
|
||||
|
||||
```plain
|
||||
RCPT TO: <christian.dita@wds.co.id>
|
||||
250 2.1.5 OK c2si11647357yhk.33
|
||||
```
|
||||
|
||||
and the second telnet connection:
|
||||
|
||||
```plain
|
||||
RCPT TO: <fake.account@wds.co.id>
|
||||
550-5.1.1 The email account that you tried to reach does not exist. [ Blah blah blah... ]
|
||||
```
|
||||
|
||||
On the first connection, it appears that the mail server wants to receive email for the intended recipient. On the second connection, the mail server does not want to receive email for the intended recipient.
|
||||
|
||||
Therefore, it can be concluded that the user `fake.account` in the `wds.co.id` domain does not actually exist.
|
||||
|
||||
Based on these three validations, I developed this basic concept of my **PHP E-Mail Advanced Validation** script.
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Sekilas Tentang DNS Hijacking"
|
||||
description: "Mengupas bagaimana secara teknis DNS hijacking itu dilakukan, bukan tutorial mengenai penggunaan tools / teknik nyata seorang attacker melakukan DNS Hijacking"
|
||||
summary: "Mengupas bagaimana secara teknis DNS hijacking itu dilakukan, bukan tutorial mengenai penggunaan tools / teknik nyata seorang attacker melakukan DNS Hijacking"
|
||||
date: 2012-01-18T03:20:20+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
|
@ -9,7 +10,7 @@ featured: false
|
|||
pinned: false
|
||||
# comments: false
|
||||
series:
|
||||
# -
|
||||
# -
|
||||
categories:
|
||||
- Security
|
||||
- Networking
|
||||
|
@ -17,7 +18,8 @@ tags:
|
|||
- DNS
|
||||
- MiTM
|
||||
images:
|
||||
# -
|
||||
- https://edge.ditatompel.com/assets/img/site-contents/sekilas-tentang-dns-hijacking/feature-dns_spoof-small-1.png
|
||||
# -
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
|
@ -30,19 +32,17 @@ authors:
|
|||
- ditatompel
|
||||
---
|
||||
|
||||
Karena belakangan ini sedang marak **DNS Hijacking**, bahkan **Twitter** pun jadi korban, saya coba membahas dan ingin berdiskusi tentang apa itu *DNS hijacking*. Disini yang ingin saya bahas adalah bagaimana secara teknis DNS hijacking itu dilakukan, bukan tutorial mengenai penggunaan *tools* / teknik nyata seorang *attacker* melakukan **DNS Hijacking**.
|
||||
|
||||
<!--more-->
|
||||
Karena belakangan ini sedang marak **DNS Hijacking**, bahkan **Twitter** pun jadi korban, saya coba membahas dan ingin berdiskusi tentang apa itu _DNS hijacking_. Disini yang ingin saya bahas adalah bagaimana secara teknis DNS hijacking itu dilakukan, bukan tutorial mengenai penggunaan _tools_ / teknik nyata seorang _attacker_ melakukan **DNS Hijacking**.
|
||||
|
||||
**DNS Hijacking** adalah teknik serangan yang bertujuan untuk mengubah entri DNS menuju ke IP lain daripada menuju ke IP sebenarnya. Sebelum melanjutkan, ada baiknya untuk mengerti terlebih dahulu mengerti apa dan bagaimana [Sistem Penamaan Domain](https://web.archive.org/web/20110530065350/http://devilzc0de.org:80/forum/thread-7744.html) (Web Archive) itu bekerja.
|
||||
|
||||
![dig command](dig.png#center)
|
||||
![dig command](https://edge.ditatompel.com/assets/img/site-contents/sekilas-tentang-dns-hijacking/dig.png#center)
|
||||
|
||||
Untuk memahami lebih baik, saya coba kasi contoh di kehidupan sehari-hari. Dan supaya tidak terlalu panjang saya pangkas *flow*nya sampai dengan *authoritative DNS* saja dan tidak sampai ke *root DNS*. (Bukan cerita nyata)
|
||||
Untuk memahami lebih baik, saya coba kasi contoh di kehidupan sehari-hari. Dan supaya tidak terlalu panjang saya pangkas *flow*nya sampai dengan _authoritative DNS_ saja dan tidak sampai ke _root DNS_. (Bukan cerita nyata)
|
||||
|
||||
Taruh kata saya ingin mencari **exploit** di situs 1337day.com. Maka saya akan memasukkan alamat 1337day.com ke *address bar browser* lalu menekan enter, sehingga saya akan dibawa ke situs [http://1337day.com/ (archive)](https://web.archive.org/web/20130329071147/http://1337day.com/) . Tapi, apa yang terjadi di balik layar saat kita melakukan aktivitas tersebut?
|
||||
Taruh kata saya ingin mencari **exploit** di situs 1337day.com. Maka saya akan memasukkan alamat 1337day.com ke _address bar browser_ lalu menekan enter, sehingga saya akan dibawa ke situs [http://1337day.com/ (archive)](https://web.archive.org/web/20130329071147/http://1337day.com/) . Tapi, apa yang terjadi di balik layar saat kita melakukan aktivitas tersebut?
|
||||
|
||||
Pada dasarnya, browser akan mengirimkan permintaan ke DNS Server untuk mendapatkan alamat IP domain 1337day.com, *authoritative DNS* server tersebut kemudian menjawab dan memberitahu browser kita alamat IP untuk 1337day.com adalah `77.120.120.218` sehingga browser kita akan mengakses alamat IP 1337day.com (`77.120.120.218`) dan menampilkan isi dari halaman website tersebut.
|
||||
Pada dasarnya, browser akan mengirimkan permintaan ke DNS Server untuk mendapatkan alamat IP domain 1337day.com, _authoritative DNS_ server tersebut kemudian menjawab dan memberitahu browser kita alamat IP untuk 1337day.com adalah `77.120.120.218` sehingga browser kita akan mengakses alamat IP 1337day.com (`77.120.120.218`) dan menampilkan isi dari halaman website tersebut.
|
||||
|
||||
Cerita berlanjut, 2 hari kemudian saya dapat kabar dari seorang teman kalau situs 1337day.com udah tutup dan berubah jadi toko baju.
|
||||
|
||||
|
@ -50,7 +50,7 @@ Otomatis saya tidak percaya, masa situs keren begitu berubah jadi toko baju.. Ya
|
|||
|
||||
Saya kaget, ternyata situs tersebut benar2 menjadi situs toko baju. Saya benar2 sudah yakin dan memastikan bahwa ini bukan sebuah lelucon. **URI** juga udah saya cek dengan teliti.
|
||||
|
||||
Saya pikir *"Ini berita heboh nih..."* Saya langsung chatting sama pacar simpanan stok no #21 yang ada di Russia (sekali lagi, bukan cerita nyata!!). Saya beritahukan berita tersebut (cw simpenan saya yang 1 ini seorang geeks). Saya terkejut karena dia bilang situs *1337day.com* baik-baik saja, isinya juga masih seputar *exploits* dan *vulnerable software*. Trus pacar simpenan saya menyuruh saya untuk *nge-ping* ke *1337day.com* dan mencocokan IP hasil ping saya dengan IP hasil `ping` si do'i, dan hasilnya berbeda!
|
||||
Saya pikir _"Ini berita heboh nih..."_ Saya langsung chatting sama pacar simpanan stok no #21 yang ada di Russia (sekali lagi, bukan cerita nyata!!). Saya beritahukan berita tersebut (cw simpenan saya yang 1 ini seorang geeks). Saya terkejut karena dia bilang situs _1337day.com_ baik-baik saja, isinya juga masih seputar _exploits_ dan _vulnerable software_. Trus pacar simpenan saya menyuruh saya untuk _nge-ping_ ke _1337day.com_ dan mencocokan IP hasil ping saya dengan IP hasil `ping` si do'i, dan hasilnya berbeda!
|
||||
|
||||
Kalau mau akses 1337day.com, langsung aja ke IPnya. Kata si do'i. Langsung saya coba akses melalui alamat IP.
|
||||
|
||||
|
@ -65,15 +65,16 @@ Nah inilah contoh korban dari skenario **DNS hijacking**. Kita mungkin bertanya-
|
|||
Ada beberapa teknik untuk melakukan DNS hijacking ini.
|
||||
|
||||
## DNS Cache Poisoning
|
||||
Seperti yang dapat kita bayangkan, DNS server tidak dapat menyimpan semua informasi tentang semua nama / IP yang ada di internet kedalam *memory space*nya. Itulah mengapa DNS server (*resolver*) melakukan *caching* yang memungkinkan untuk menyimpan DNS record untuk sementara waktu. Sebuah fakta bahwa Server DNS memiliki catatan / otoritas domain hanya untuk domain2 yang diarahkan kepadanya, Jika sebuah DNS Server (*resolver*) memerlukan *record* domain di luar otoritasnya, DNS Server akan mengirimkan permintaan ke server DNS lain yang bertanggung jawab atas record domain yang diperlukan. Karena itulah DNS menyimpan *record* ke dalam *cache* karena tidak mungkin sebuah DNS server melakukan *forward* request ada permintaan / *query*.
|
||||
|
||||
Informasi yang saya tuliskan diatas sudah dipersimple, karena sebenarnya di balik layar prosesnya jauh lebih kompleks. Saya akan coba membuat artikel khusus mengenai *Root DNS*, *Resolver*, *TLD*, dan *Authoritative DNS* di lain waktu.
|
||||
Seperti yang dapat kita bayangkan, DNS server tidak dapat menyimpan semua informasi tentang semua nama / IP yang ada di internet kedalam *memory space*nya. Itulah mengapa DNS server (_resolver_) melakukan _caching_ yang memungkinkan untuk menyimpan DNS record untuk sementara waktu. Sebuah fakta bahwa Server DNS memiliki catatan / otoritas domain hanya untuk domain2 yang diarahkan kepadanya, Jika sebuah DNS Server (_resolver_) memerlukan _record_ domain di luar otoritasnya, DNS Server akan mengirimkan permintaan ke server DNS lain yang bertanggung jawab atas record domain yang diperlukan. Karena itulah DNS menyimpan _record_ ke dalam _cache_ karena tidak mungkin sebuah DNS server melakukan _forward_ request ada permintaan / _query_.
|
||||
|
||||
Sekarang mari kita lihat bagaimana seseorang melakukan *cache poisoning* ke DNS Server kita.
|
||||
Informasi yang saya tuliskan diatas sudah dipersimple, karena sebenarnya di balik layar prosesnya jauh lebih kompleks. Saya akan coba membuat artikel khusus mengenai _Root DNS_, _Resolver_, _TLD_, dan _Authoritative DNS_ di lain waktu.
|
||||
|
||||
![DNS Cache Poisoning](dns-cache-poisoning.jpg#center)
|
||||
Sekarang mari kita lihat bagaimana seseorang melakukan _cache poisoning_ ke DNS Server kita.
|
||||
|
||||
1. Penyerang melakukan *query* ke DNS server untuk alamat IP yang dikelola oleh *name server* yang dimiliki oleh penyerang "Berapa adalah alamat IP dari owned.com?"
|
||||
![DNS Cache Poisoning](https://edge.ditatompel.com/assets/img/site-contents/sekilas-tentang-dns-hijacking/dns-cache-poisoning.jpg#center)
|
||||
|
||||
1. Penyerang melakukan _query_ ke DNS server untuk alamat IP yang dikelola oleh _name server_ yang dimiliki oleh penyerang "Berapa adalah alamat IP dari owned.com?"
|
||||
2. DNS Cache Server tidak memiliki cache record untuk owned.com dan harus meneruskan query ke DNS Server yang bertanggungjawab untuk domain owned.com dimana DNS Server yang bertanggungjawab telah dikuasai oleh penyerang.
|
||||
3. DNS server milik penyerang memberitahu DNS Cache Server bahwa alamat IP dari owned.com adalah 200.1.1.10. Bersamaan dengan itu, DNS server milik penyerang juga menyisipkan record palsu. Misalnya :
|
||||
|
||||
|
@ -81,29 +82,32 @@ Sekarang mari kita lihat bagaimana seseorang melakukan *cache poisoning* ke DNS
|
|||
1337day.com adalah 111.1.1.11
|
||||
mail.1337day.com adalah 111.1.1.11
|
||||
```
|
||||
4. DNS Cache Server merespon untuk query asli penyerang dengan - *"Alamat IP dari owned.com adalah 200.1.1.10."* Tapi siapa yang peduli, tujuan penyerang bukan untuk mendapatkan alamat IP dari owned.com, tapi untuk melakukan transfer record palsu diatas.
|
||||
5. Beberapa hari kemudian, seorang user biasa yang juga menggunakan DNS Cache Server yang sama melakukan query untuk alamat IP dari 1337day.com - *"Berapa adalah alamat IP dari 1337day.com?"*
|
||||
|
||||
4. DNS Cache Server merespon untuk query asli penyerang dengan - _"Alamat IP dari owned.com adalah 200.1.1.10."_ Tapi siapa yang peduli, tujuan penyerang bukan untuk mendapatkan alamat IP dari owned.com, tapi untuk melakukan transfer record palsu diatas.
|
||||
5. Beberapa hari kemudian, seorang user biasa yang juga menggunakan DNS Cache Server yang sama melakukan query untuk alamat IP dari 1337day.com - _"Berapa adalah alamat IP dari 1337day.com?"_
|
||||
6. DNS Cache Server merespon request user biasa tersebut dari cache dengan record palsu yang sebelumnya telah disisipkan oleh penyerang.
|
||||
|
||||
![DNS Spoofing](feature-dns_spoof-small-1.png#center)
|
||||
![DNS Spoofing](https://edge.ditatompel.com/assets/img/site-contents/sekilas-tentang-dns-hijacking/feature-dns_spoof-small-1.png#center)
|
||||
|
||||
## DNS ID Spoofing (with Sniffing)
|
||||
Ketika komputer A melakukan request alamat IP server B melalui sebuah DNS Server, komputer A membawa informasi sebuah nomor identitas acak yang harus dibawa ketika melakukan *query* ke DNS Server, kemudian ketika jawaban dari DNS Server diterima oleh komputer A dan dibandingkan dengan identitas acak tadi. Dalam hal ini jika kedua angka tadi sama, maka jawaban akan dianggap valid, dan jika tidak sama maka jawaban akan diabaikan oleh komputer A.
|
||||
|
||||
Ketika komputer A melakukan request alamat IP server B melalui sebuah DNS Server, komputer A membawa informasi sebuah nomor identitas acak yang harus dibawa ketika melakukan _query_ ke DNS Server, kemudian ketika jawaban dari DNS Server diterima oleh komputer A dan dibandingkan dengan identitas acak tadi. Dalam hal ini jika kedua angka tadi sama, maka jawaban akan dianggap valid, dan jika tidak sama maka jawaban akan diabaikan oleh komputer A.
|
||||
|
||||
Pertanyaannya, apakah konsep ini aman? Tidak sepenuhnya.
|
||||
|
||||
Siapa pun bisa memulai serangan untuk mendapatkan nomor identitas tersebut. Jika Anda misalnya pada **LAN** / **Wireless**, seseorang dapat melakukan *sniffing* saat komputer A melakukan request ke DNS Server, melihat ID permintaan dan mengirimkan jawaban record palsu dengan nomor ID yang benar.
|
||||
Siapa pun bisa memulai serangan untuk mendapatkan nomor identitas tersebut. Jika Anda misalnya pada **LAN** / **Wireless**, seseorang dapat melakukan _sniffing_ saat komputer A melakukan request ke DNS Server, melihat ID permintaan dan mengirimkan jawaban record palsu dengan nomor ID yang benar.
|
||||
|
||||
Bingung? Untuk lebih jelas bisa lihat gambar di bawah.
|
||||
|
||||
![DNS Spoofing ID](dns-spoofing-id.jpg#center)
|
||||
1. User mengirimkan melakukan UDP request ke DNS Server - *"Berapa adalah alamat IP dari 1337day.com?"* - Dengan ID dari 212.
|
||||
2. Penyerang melakukan *snifing* semua lalu lintas jaringan user tersebut dan merespon DNS query.
|
||||
3. Setelah mengidentifikasi DNS query untuk 1337day.com dengan ID 212, penyerang merespon dengan "Alamat IP dari 1337day.com adalah 111.1.1.11" menggunakan ID yang sama.
|
||||
4. Dan baru beberapa saat kemudian, DNS Server mengirimkan respon *"Alamat IP dari 1337day.com adalah 77.120.120.218"*, tetapi diabaikan oleh komputer user karena telah menerima respon sebelumnya dari penyerang.
|
||||
Ada beberapa keterbatasan untuk teknik serangan ini. Dari contoh di atas, penyerang menjalankan *sniffing*, mendapatkan nomor ID dan harus mampu membangun respon palsu lebih cepat daripada server DNS dapat menyediakan jawaban yang sah.
|
||||
![DNS Spoofing ID](https://edge.ditatompel.com/assets/img/site-contents/sekilas-tentang-dns-hijacking/dns-spoofing-id.jpg#center)
|
||||
|
||||
Sekian dulu untuk DNS Hijackingnya, sebenernya masih ada beberapa teknik untuk melakukan DNS Hijacking seperti DNS ID Spoofing (*without Sniffing*), *Birthday Attack*, *Page Rank Escalation*, dll seperti yang ada di [Pharming Attack Vectors Section 3](http://www.technicalinfo.net/papers/Pharming2.html) (cukup lengkap klo saya bilang).
|
||||
1. User mengirimkan melakukan UDP request ke DNS Server - _"Berapa adalah alamat IP dari 1337day.com?"_ - Dengan ID dari 212.
|
||||
2. Penyerang melakukan _snifing_ semua lalu lintas jaringan user tersebut dan merespon DNS query.
|
||||
3. Setelah mengidentifikasi DNS query untuk 1337day.com dengan ID 212, penyerang merespon dengan "Alamat IP dari 1337day.com adalah 111.1.1.11" menggunakan ID yang sama.
|
||||
4. Dan baru beberapa saat kemudian, DNS Server mengirimkan respon _"Alamat IP dari 1337day.com adalah 77.120.120.218"_, tetapi diabaikan oleh komputer user karena telah menerima respon sebelumnya dari penyerang.
|
||||
Ada beberapa keterbatasan untuk teknik serangan ini. Dari contoh di atas, penyerang menjalankan _sniffing_, mendapatkan nomor ID dan harus mampu membangun respon palsu lebih cepat daripada server DNS dapat menyediakan jawaban yang sah.
|
||||
|
||||
Sekian dulu untuk DNS Hijackingnya, sebenernya masih ada beberapa teknik untuk melakukan DNS Hijacking seperti DNS ID Spoofing (_without Sniffing_), _Birthday Attack_, _Page Rank Escalation_, dll seperti yang ada di [Pharming Attack Vectors Section 3](http://www.technicalinfo.net/papers/Pharming2.html) (cukup lengkap klo saya bilang).
|
||||
|
||||
Saya akan coba tambahin dan benerin kata2 yang masih belepotan di kesempatan lain.
|
||||
|
||||
|
@ -112,7 +116,6 @@ Source :
|
|||
- paper dari situs **darkc0de.com**
|
||||
- [Sistem Penamaan Domain](https://web.archive.org/web/20110530065350/http://devilzc0de.org:80/forum/thread-7744.html) oleh **linuxer46** (Web Archive)
|
||||
- **SET(harvester)+Dns Spoofing** (*dead link *URL: `http://devilzc0de.org:80/forum/thread-11128.html`) oleh **motaroirhaby**
|
||||
- **DNS spoofing di Local Network Tutorial** (*dead link* URL: `http://devilzc0de.org/forum/thread-2671.html`) oleh **wenkhairu**
|
||||
- **DNS Cache Poisoning** (*dead link* URL: `http://devilzc0de.org/forum/thread-800.html`) oleh **oela**
|
||||
- **DNS spoofing di Local Network Tutorial** (_dead link_ URL: `http://devilzc0de.org/forum/thread-2671.html`) oleh **wenkhairu**
|
||||
- **DNS Cache Poisoning** (_dead link_ URL: `http://devilzc0de.org/forum/thread-800.html`) oleh **oela**
|
||||
- [Bailiwicked DNS Attack (Cache Poisoning)](https://web.archive.org/web/20210921234941/http://ezine.echo.or.id/ezine19/e19.008.txt) oleh **Cyberheb** (Web Archive)
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Compile Nginx Latest Stable Version Dari Source Code"
|
||||
description: Bukan rahasia umum bahwa sampai saat ini web server yang paling banyak digunakan adalah Apache, tapi bagaimana dengan web server lain? Apakah tidak se-powerful Apache?
|
||||
summary: Bukan rahasia umum bahwa sampai saat ini web server yang paling banyak digunakan adalah Apache, tapi bagaimana dengan web server lain? Apakah tidak se-powerful Apache?
|
||||
# linkTitle:
|
||||
date: 2011-08-25T18:00:31+07:00
|
||||
lastmod:
|
||||
|
@ -34,20 +35,15 @@ authors:
|
|||
- ditatompel
|
||||
---
|
||||
|
||||
Bukan rahasia umum bahwa sampai saat ini web server yang paling banyak digunakan adalah **Apache**, tapi bagaimana dengan *web server* lain? Apakah tidak *se-powerful* Apache?
|
||||
|
||||
**Nginx**, sebuah *web server* yang di-develop oleh **Igor Sysoev** pada tahun 2002 Menjadi sebuah alternatif baru pengganti **Apache**.
|
||||
|
||||
<!--more-->
|
||||
**Nginx**, sebuah _web server_ yang di-develop oleh **Igor Sysoev** pada tahun 2002 Menjadi sebuah alternatif baru pengganti **Apache**.
|
||||
|
||||
> _**CATATAN**: Artikel ini dibuat di tahun 2011, jadi Anda perlu beradaptasi dalam mengikuti tutorial ini. Terelebih lagi, saat ini mayoritas distribusi Linux sudah banyak meninggalkan `sysVinit` beralih menggunakan `SystemD`._
|
||||
|
||||
|
||||
Nginx (pengucapan **"Engine X"**) adalah *web server* / *reverse proxy* dan *e-mail* (**IMAP**/**POP3**) *proxy* yang ringan dengan kinerja tinggi , dilisensikan di bawah **lisensi BSD**. Berjalan pada **UNIX**, **GNU/Linux**, **Solaris**, **Varian BSD** seperti **Mac OS X**, dan **Microsoft Windows**.
|
||||
Nginx (pengucapan **"Engine X"**) adalah _web server_ / _reverse proxy_ dan _e-mail_ (**IMAP**/**POP3**) _proxy_ yang ringan dengan kinerja tinggi , dilisensikan di bawah **lisensi BSD**. Berjalan pada **UNIX**, **GNU/Linux**, **Solaris**, **Varian BSD** seperti **Mac OS X**, dan **Microsoft Windows**.
|
||||
|
||||
## Kenapa Nginx?
|
||||
|
||||
1. **Kecepatan**: Cukup satu *core processor* untuk menangani ribuan koneksi, sehingga beban CPU dan konsumsi *memory* jauh lebih ringan.
|
||||
1. **Kecepatan**: Cukup satu _core processor_ untuk menangani ribuan koneksi, sehingga beban CPU dan konsumsi _memory_ jauh lebih ringan.
|
||||
|
||||
2. **Mudah digunakan**: Konfigurasi file jauh lebih mudah dimengerti dan dimodifikasi daripada konfigurasi web server lainnya seperti Apache. Beberapa baris saja sudah cukup untuk menciptakan sebuah `virtual host` yang cukup lengkap.
|
||||
|
||||
|
@ -55,30 +51,34 @@ Nginx (pengucapan **"Engine X"**) adalah *web server* / *reverse proxy* dan *e-m
|
|||
|
||||
4. dan yang paling penting, **Open Source** (BSD-like license)
|
||||
|
||||
Beberapa contoh website besar yang menggunakan Nginx entah itu sebagai web server atau sebagai *reserve proxy* sebagai backend Apache antara lain : **kaskus.us**, **indowebster.com**, **wordpress.com**, **sourceforge.net**, **github.com**, dll.
|
||||
Beberapa contoh website besar yang menggunakan Nginx entah itu sebagai web server atau sebagai _reserve proxy_ sebagai backend Apache antara lain : **kaskus.us**, **indowebster.com**, **wordpress.com**, **sourceforge.net**, **github.com**, dll.
|
||||
|
||||
## Latar Belakang Melakukan Kompilasi
|
||||
Dalam proses instalasi web server, dibutuhkan beberapa *tools* dan parameter yang harus kita putuskan pada saat kompilasi, dan beberapa konfigurasi tambahan yang harus dilakukan dan disesuaikan dengan sistem kita.
|
||||
|
||||
Nah, kali ini kita memilih untuk *men-download* *source code* aplikasi dan menginstalnya secara manual daripada menginstal menggunakan *package manager*. Ada beberapa alasan kenapa orang memilih melakukan instalasi secara manual :
|
||||
Dalam proses instalasi web server, dibutuhkan beberapa _tools_ dan parameter yang harus kita putuskan pada saat kompilasi, dan beberapa konfigurasi tambahan yang harus dilakukan dan disesuaikan dengan sistem kita.
|
||||
|
||||
1. Mengenal lebih jauh bagaimana sistem (terutama *web server*) yang kita gunakan itu bekerja.
|
||||
Nah, kali ini kita memilih untuk _men-download_ _source code_ aplikasi dan menginstalnya secara manual daripada menginstal menggunakan _package manager_. Ada beberapa alasan kenapa orang memilih melakukan instalasi secara manual :
|
||||
|
||||
1. Mengenal lebih jauh bagaimana sistem (terutama _web server_) yang kita gunakan itu bekerja.
|
||||
2. (Mungkin) belum tersedia dalam repositori dari distribusi Linux yang sedang digunakan.
|
||||
|
||||
Disamping itu jarang repositori yang menawarkan untuk *men-download* dan menginstall Nginx menggunakan *package manager* (`yum`|`apt`|`yast`) untuk versi yang terbaru (kecuali pada distribusi *rolling-release* seperti **Arch Linux**). Kebanyakan menyediakan versi lama yang kurang *up-to-date* alias basi. x_x.
|
||||
Disamping itu jarang repositori yang menawarkan untuk _men-download_ dan menginstall Nginx menggunakan _package manager_ (`yum`|`apt`|`yast`) untuk versi yang terbaru (kecuali pada distribusi _rolling-release_ seperti **Arch Linux**). Kebanyakan menyediakan versi lama yang kurang _up-to-date_ alias basi. x_x.
|
||||
|
||||
## Proses Kompilasi Nginx
|
||||
Berikut ini ada *capture screen video* yang sudah saya buat sebelumnya. Mungkin bisa membantu dalam proses installasi. (tidak perlu sama persis, yang penting tau proses dan cara kerja-nya)
|
||||
|
||||
Berikut ini ada _capture screen video_ yang sudah saya buat sebelumnya. Mungkin bisa membantu dalam proses installasi. (tidak perlu sama persis, yang penting tau proses dan cara kerja-nya)
|
||||
|
||||
{{< youtube AtJ5OBOj1gE >}}
|
||||
|
||||
### Download source-code
|
||||
|
||||
Pertama, mari kita download web server kita dari [http://nginx.org/download/nginx-1.0.5.tar.gz](http://nginx.org/download/nginx-1.0.5.tar.gz) (saat saya menulis artikel ini versi stable terbarunya adalah `1.0.5`).
|
||||
|
||||
```bash
|
||||
wget http://nginx.org/download/nginx-1.0.5.tar.gz
|
||||
```
|
||||
setelah itu,*copy source* tersebut ke `/usr/local/src/` kemudian *extract*.
|
||||
|
||||
setelah itu,_copy source_ tersebut ke `/usr/local/src/` kemudian _extract_.
|
||||
|
||||
```bash
|
||||
sudo cp nginx-1.0.5.tar.gz /usr/local/src/
|
||||
|
@ -87,49 +87,57 @@ sudo tar -xvzf nginx-1.0.5.tar.gz
|
|||
```
|
||||
|
||||
**Catatan:**
|
||||
1. Sebelum proses installasi, lebih baik cek apakah `port 80` sedang digunakan atau tidak. Saya menggunakan distro **BackTrack** dan secara default **Apache** menggunakan `port 80` pada saat *startup*. `/etc/init.d/apache2 stop` atau `killall apache2`.
|
||||
2. Nginx adalah program yang dibuat menggunakan **bahasa C**, jadi untuk dapat menggunakannya pertama-tama kita harus punya *tools* seperti **GNU Compiler Collection (GCC)** pada komputer kita. **GCC** biasanya sudah terinstall pada kebanyakan Linux distro.
|
||||
|
||||
Untuk memastikannya, jalankan saja perintah "`gcc`" (tanpa quote) melalui terminal. Jika anda mendapatkan *output* *"gcc: no input files"* berarti GCC sudah terinstall pada komputer anda. Jika tidak, anda perlu menginstallnya terlebih dahulu.
|
||||
1. Sebelum proses installasi, lebih baik cek apakah `port 80` sedang digunakan atau tidak. Saya menggunakan distro **BackTrack** dan secara default **Apache** menggunakan `port 80` pada saat _startup_. `/etc/init.d/apache2 stop` atau `killall apache2`.
|
||||
2. Nginx adalah program yang dibuat menggunakan **bahasa C**, jadi untuk dapat menggunakannya pertama-tama kita harus punya _tools_ seperti **GNU Compiler Collection (GCC)** pada komputer kita. **GCC** biasanya sudah terinstall pada kebanyakan Linux distro.
|
||||
|
||||
Untuk memastikannya, jalankan saja perintah "`gcc`" (tanpa quote) melalui terminal. Jika anda mendapatkan _output_ _"gcc: no input files"_ berarti GCC sudah terinstall pada komputer anda. Jika tidak, anda perlu menginstallnya terlebih dahulu.
|
||||
|
||||
Oke, lanjott..
|
||||
|
||||
### ./configure dan make install
|
||||
|
||||
masuk ke folder `nginx-1.0.5` pada direktori `/usr/local/src/` dan mulai lakukan kompilasi.
|
||||
|
||||
```bash
|
||||
cd nginx-1.0.5
|
||||
./configure
|
||||
```
|
||||
|
||||
Secara default, **HTTP rewrite module** onomatis ikut terinstall saat instalasi default Nginx. Module ini memerlukan **PCRE (Perl Compatible Regular Expression) library** karena **Rewrite** dan **HTTP Core modules** dari Nginx menggunakan PCRE sebagai syntax *regular expression* mereka.
|
||||
Secara default, **HTTP rewrite module** onomatis ikut terinstall saat instalasi default Nginx. Module ini memerlukan **PCRE (Perl Compatible Regular Expression) library** karena **Rewrite** dan **HTTP Core modules** dari Nginx menggunakan PCRE sebagai syntax _regular expression_ mereka.
|
||||
|
||||
Sekarang tergantung pilihan kita, jika kita :
|
||||
|
||||
1. membutuhkan *rewrite module*, kita harus install PCRE terlebih dahulu:
|
||||
1. membutuhkan _rewrite module_, kita harus install PCRE terlebih dahulu:
|
||||
|
||||
```bash
|
||||
apt-get install libpcre3 libpcre3-dev
|
||||
```
|
||||
|
||||
2. jika kita tidak membutuhkannya :
|
||||
|
||||
```bash
|
||||
./configure --without-http_rewrite_module
|
||||
```
|
||||
Pilihan kita jatuh pada opsi pertama karena nantinya kebanyakan situs yang digunakan sangat membutuhkan *rewrite module* tersebut. Maka setelah melakukan instalasi PCRE, kita harus melakukan konfigurasi kembali.
|
||||
|
||||
Pilihan kita jatuh pada opsi pertama karena nantinya kebanyakan situs yang digunakan sangat membutuhkan _rewrite module_ tersebut. Maka setelah melakukan instalasi PCRE, kita harus melakukan konfigurasi kembali.
|
||||
|
||||
```bash
|
||||
./configure
|
||||
```
|
||||
|
||||
lakukan proses installasi :
|
||||
|
||||
```bash
|
||||
make && make install
|
||||
```
|
||||
proses instalasi default yang kita lakukan di atas akan menempatkan *"ruang kerja"* Nginx pada direktori `/usr/local/nginx`
|
||||
|
||||
proses instalasi default yang kita lakukan di atas akan menempatkan _"ruang kerja"_ Nginx pada direktori `/usr/local/nginx`
|
||||
|
||||
### Membuat SysVinit untuk Nginx
|
||||
|
||||
buat file dengan nama `nginx` pada direktori `/etc/init.d`
|
||||
|
||||
```bash
|
||||
nano /etc/init.d/nginx
|
||||
```
|
||||
|
@ -199,19 +207,19 @@ esac
|
|||
exit 0
|
||||
```
|
||||
|
||||
`chmod +x` supaya *script* dapat dieksekusi
|
||||
`chmod +x` supaya _script_ dapat dieksekusi
|
||||
|
||||
```bash
|
||||
chmod +x /etc/init.d/nginx
|
||||
```
|
||||
|
||||
Setelah ini, maka kita dapat melakukan **start**, **stop**, **restart** atau **reload** proses Nginx melalui *script* tersebut. Mari kita coba jalankan Nginx:
|
||||
Setelah ini, maka kita dapat melakukan **start**, **stop**, **restart** atau **reload** proses Nginx melalui _script_ tersebut. Mari kita coba jalankan Nginx:
|
||||
|
||||
```bash
|
||||
/etc/init.d/nginx start
|
||||
```
|
||||
|
||||
Maka seharusnya kita mendapatkan pesan sambutan *"welcome to nginx!"* saat mengakses `localhost` dari brwoser Anda.
|
||||
Maka seharusnya kita mendapatkan pesan sambutan _"welcome to nginx!"_ saat mengakses `localhost` dari brwoser Anda.
|
||||
|
||||
## Instalasi dan konfigurasi PHP FAST CGI (spawn-fcgi) dengan Nginx
|
||||
|
||||
|
@ -221,13 +229,13 @@ Download PHP `spawn-fcgi`
|
|||
apt-get install php5-cgi spawn-fcgi
|
||||
```
|
||||
|
||||
Setelah proses installasi melalui *package manager* selesai, buat file bernama `php-fastcgi` pada direktori `/etc/init.d`
|
||||
Setelah proses installasi melalui _package manager_ selesai, buat file bernama `php-fastcgi` pada direktori `/etc/init.d`
|
||||
|
||||
```bash
|
||||
nano /etc/init.d/php-fastcgi
|
||||
```
|
||||
|
||||
Copy paste *shell init script* di bawah ini.
|
||||
Copy paste _shell init script_ di bawah ini.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
@ -273,7 +281,7 @@ esac
|
|||
exit $RETVAL
|
||||
```
|
||||
|
||||
jangan lupa `chmod +x` supaya *script* dapat dieksekusi
|
||||
jangan lupa `chmod +x` supaya _script_ dapat dieksekusi
|
||||
|
||||
```bash
|
||||
chmod +x /etc/init.d/php-fastcgi
|
||||
|
@ -297,7 +305,7 @@ kemudian edit konfigurasi Nginx agar sesuai dengan struktur website yang sedang
|
|||
nano /usr/local/nginx/conf/nginx.conf
|
||||
```
|
||||
|
||||
Karena *root public html* kita berada di `/var/www/nginx` maka konfigurasi sebagai berikut :
|
||||
Karena _root public html_ kita berada di `/var/www/nginx` maka konfigurasi sebagai berikut :
|
||||
|
||||
```nginx
|
||||
#user nobody;
|
||||
|
@ -442,14 +450,13 @@ Dari situ kita dapat menentukan apakah nNginx sudah dapat berjalan dan melakukan
|
|||
|
||||
Layaknya sebuah aplikasi, pasti tidak akan lepas dari yang namanya bugs. Begitu juga dengan Nginx.
|
||||
|
||||
### Nginx “*no input file specified”* PHP fast-cgi 0day Exploit
|
||||
|
||||
### Nginx “_no input file specified”_ PHP fast-cgi 0day Exploit
|
||||
|
||||
Setelah Nginx dan PHP CGI berjalan, cobalah test mengakses http://localhost/terserah.php
|
||||
|
||||
Jika browser menunjukan *“no input file specified”*, konfigurasi kita masih rentan dan belum layak dipakai.
|
||||
Jika browser menunjukan _“no input file specified”_, konfigurasi kita masih rentan dan belum layak dipakai.
|
||||
|
||||
**Exploit** : Buat file `apaaja.gif` menggunakan **GIMP**. Pada kotak komentar isi dengan *script PHP* `<?php phpinfo(); ?>` dan letakan pada direktori nginx server root (jika dalam artikel kali ini `/var/www/nginx/apaaja.gif`).
|
||||
**Exploit** : Buat file `apaaja.gif` menggunakan **GIMP**. Pada kotak komentar isi dengan _script PHP_ `<?php phpinfo(); ?>` dan letakan pada direktori nginx server root (jika dalam artikel kali ini `/var/www/nginx/apaaja.gif`).
|
||||
|
||||
![Nginx 0day](nginx-0day.png#center)
|
||||
|
||||
|
@ -457,15 +464,15 @@ Secara normal, jika kita akses dari browser `http://localhost/apaaja.gif` akan n
|
|||
|
||||
![Nginx 0day Exploit](nginx-0day-exploit.png#center)
|
||||
|
||||
File `.gif` tersebut dieksekusi sebagai file PHP (ingat *comment* pada file `.gif` `<?php phpinfo(); ?>`).
|
||||
File `.gif` tersebut dieksekusi sebagai file PHP (ingat _comment_ pada file `.gif` `<?php phpinfo(); ?>`).
|
||||
|
||||
Tentu saja `http://localhost/apaaja.gif/terserah.php` sebenarnya tidak ada. Tapi tiap request yang diakhiri dengan `.php` akan **DIEKSEKUSI** sebagai script PHP oleh Nginx melalui fitur `cgi.fix_pathinfo` sehingga Nginx mengeksekusi file `.gif` tersebut sebagai script PHP!
|
||||
Tentu saja `http://localhost/apaaja.gif/terserah.php` sebenarnya tidak ada. Tapi tiap request yang diakhiri dengan `.php` akan **DIEKSEKUSI** sebagai script PHP oleh Nginx melalui fitur `cgi.fix_pathinfo` sehingga Nginx mengeksekusi file `.gif` tersebut sebagai script PHP!
|
||||
|
||||
Cara mengatasi :
|
||||
|
||||
1. Ubah `cgi.fix_pathinfo=1` menjadi `cgi.fix_pathinfo=0` pada `php.ini`
|
||||
|
||||
2. Edit `/usr/local/nginx/conf/nginx.conf` dan tambahkan sctipt berikut di antara *block* `server { }`
|
||||
2. Edit `/usr/local/nginx/conf/nginx.conf` dan tambahkan sctipt berikut di antara _block_ `server { }`
|
||||
|
||||
```nginx
|
||||
error_page 400 402 403 404 /40x.html;
|
||||
|
@ -478,76 +485,77 @@ error_page 400 402 403 404 /40x.html;
|
|||
|
||||
### Nginx Configure Module options
|
||||
|
||||
Saat proses konfigurasi, beberapa *module* akan aktif secara default, dan beberapa *module* perlu diaktifkan secara manual.
|
||||
Saat proses konfigurasi, beberapa _module_ akan aktif secara default, dan beberapa _module_ perlu diaktifkan secara manual.
|
||||
|
||||
#### Otomatis aktif
|
||||
Berikut ini *module-module* yang **otomatis aktif** saat command `./configure` dijalankan, tambahkan perintah-perintah di bawah untuk *me-disable* module tersebut:
|
||||
|
||||
`--without-http_charset_module`: Menonaktifkan *module* *Charset* untuk *re-encoding* halaman web.
|
||||
Berikut ini _module-module_ yang **otomatis aktif** saat command `./configure` dijalankan, tambahkan perintah-perintah di bawah untuk _me-disable_ module tersebut:
|
||||
|
||||
`--without-http_gzip_module`: Menonaktifkan *module* kompresi **Gzip**.
|
||||
`--without-http_charset_module`: Menonaktifkan _module_ _Charset_ untuk _re-encoding_ halaman web.
|
||||
|
||||
`--without-http_gzip_module`: Menonaktifkan _module_ kompresi **Gzip**.
|
||||
|
||||
`--without-http_ssi_module`: Menonaktifkan **Server Side Include module**.
|
||||
|
||||
`--without-http_userid_module`: Menonaktifkan *User ID module* yang menyediakan identifikasi pengguna menggunakan cookies.
|
||||
`--without-http_userid_module`: Menonaktifkan _User ID module_ yang menyediakan identifikasi pengguna menggunakan cookies.
|
||||
|
||||
`--without-http_access_module`: Menonaktifkan *module* pembatasan akses yang memungkinkan kita untuk konfigurasi akses untuk **IP range** tertentu. misal : `deny 192.168.1.1/24`.
|
||||
`--without-http_access_module`: Menonaktifkan _module_ pembatasan akses yang memungkinkan kita untuk konfigurasi akses untuk **IP range** tertentu. misal : `deny 192.168.1.1/24`.
|
||||
|
||||
`--without-http_auth_basic_module`: Menonaktifkan **Basic Authentication module**. (seperti **Auth Basic Apache**)
|
||||
|
||||
`--without-http_autoindex_module`: Menonaktifkan **Automatic Index module**.
|
||||
|
||||
`--without-http_geo_module`: Menonaktifkan *module* yang memungkinkan kita untuk mendefinisikan *variabel* menurut **IP range** tertentu.
|
||||
`--without-http_geo_module`: Menonaktifkan _module_ yang memungkinkan kita untuk mendefinisikan _variabel_ menurut **IP range** tertentu.
|
||||
|
||||
`--without-http_map_module`: Module ini memungkinkan kita untuk mengklasifikasikan suatu nilai menjadi nilai yang berbeda, menyimpan hasilnya dalam bentuk *variabel*.
|
||||
`--without-http_map_module`: Module ini memungkinkan kita untuk mengklasifikasikan suatu nilai menjadi nilai yang berbeda, menyimpan hasilnya dalam bentuk _variabel_.
|
||||
|
||||
`--without-http_referer_module`: Module ini memungkinkan untuk memblokir akses berdasarkan *header* `http referer`.
|
||||
`--without-http_referer_module`: Module ini memungkinkan untuk memblokir akses berdasarkan _header_ `http referer`.
|
||||
|
||||
`--without-http_rewrite_module`: Menonaktifkan module **Rewrite**.
|
||||
|
||||
`--without-http_proxy_module`: Menonaktifkan **module HTTP proxy** untuk request transfer ke server lain (*reverse proxy*).
|
||||
`--without-http_proxy_module`: Menonaktifkan **module HTTP proxy** untuk request transfer ke server lain (_reverse proxy_).
|
||||
|
||||
`--without-http_fastcgi_module`: Menonaktifkan *module* untuk interaksi dengan proses **FastCGI**.
|
||||
`--without-http_fastcgi_module`: Menonaktifkan _module_ untuk interaksi dengan proses **FastCGI**.
|
||||
|
||||
`--without-http_memcached_module`: Menonaktifkan *module* untuk interaksi dengan daemon *memcache*.
|
||||
`--without-http_memcached_module`: Menonaktifkan _module_ untuk interaksi dengan daemon _memcache_.
|
||||
|
||||
`--without-http_limit_zone_module`: Module ini memungkinkan untuk membatasi jumlah koneksi untuk alamat / direktori tertentu.
|
||||
|
||||
`--without-http_limit_req_module`: Menonaktifkan **module limit request** yang memungkinkan kita untuk membatasi jumlah *request per user*.
|
||||
`--without-http_limit_req_module`: Menonaktifkan **module limit request** yang memungkinkan kita untuk membatasi jumlah _request per user_.
|
||||
|
||||
`--without-http_empty_gif_module`: Menampilkan gambar `.gif` transparan berukuran 1px x 1px. (sangat berguna untuk web designer)
|
||||
|
||||
`--without-http_browser_module`: Menonaktifkan module yang menungkinkan kita untuk membaca *string* **User Agent**.
|
||||
`--without-http_browser_module`: Menonaktifkan module yang menungkinkan kita untuk membaca _string_ **User Agent**.
|
||||
|
||||
`--without-http_upstream_ip_hash_module`: Menonaktifkan **module IP-hash** untuk load-balancing ke *upstream* server.
|
||||
`--without-http_upstream_ip_hash_module`: Menonaktifkan **module IP-hash** untuk load-balancing ke _upstream_ server.
|
||||
|
||||
#### Tidak otomatis aktif
|
||||
|
||||
Berikut ini module-module yang tidak aktif saat command `./configure` dijalankan, tambahkan perintah-perintah di bawah untuk *me-enable module* tersebut:
|
||||
Berikut ini module-module yang tidak aktif saat command `./configure` dijalankan, tambahkan perintah-perintah di bawah untuk _me-enable module_ tersebut:
|
||||
|
||||
`--with-http_ssl_module`: Mengaktifkan **module SSL** untuk website menggunakan protokol `https://`.
|
||||
|
||||
`--with-http_realip_module`: Mengaktifkan *module* untuk membaca alamat IP yang sebenarnya dari sebuah request (biasanya didapat dari **HTTP header** *trusted proxy*).
|
||||
`--with-http_realip_module`: Mengaktifkan _module_ untuk membaca alamat IP yang sebenarnya dari sebuah request (biasanya didapat dari **HTTP header** _trusted proxy_).
|
||||
|
||||
`--with-http_addition_module`: Mengaktifkan *module* yang memungkinkan kita menambahkan data ke halaman website.
|
||||
`--with-http_addition_module`: Mengaktifkan _module_ yang memungkinkan kita menambahkan data ke halaman website.
|
||||
|
||||
`--with-http_xslt_module`: Mengaktifkan *module* untuk transformasi XSL ke XML. Catatan: Perlu menginstal `libxml2` dan `libxslt` *library*.
|
||||
`--with-http_xslt_module`: Mengaktifkan _module_ untuk transformasi XSL ke XML. Catatan: Perlu menginstal `libxml2` dan `libxslt` _library_.
|
||||
|
||||
`--with-http_image_filter_module`: Mengaktifkan *module* yang memungkinkan kita untuk modifikasi gambar. Catatan: Perlu menginstal `libgd` *library* untuk *module* ini.
|
||||
`--with-http_image_filter_module`: Mengaktifkan _module_ yang memungkinkan kita untuk modifikasi gambar. Catatan: Perlu menginstal `libgd` _library_ untuk _module_ ini.
|
||||
|
||||
`--with-http_sub_module`: Mengaktifkan *module* untuk melakukan *replace* teks dalam halaman web.
|
||||
`--with-http_sub_module`: Mengaktifkan _module_ untuk melakukan _replace_ teks dalam halaman web.
|
||||
|
||||
`--with-http_dav_module`: Mengaktifkan fitur **WebDAV**
|
||||
|
||||
`--with-http_flv_module`: Mengaktifkan *module* khusus untuk *meng-handle* *flash video file* (`.flv`).
|
||||
`--with-http_flv_module`: Mengaktifkan _module_ khusus untuk _meng-handle_ _flash video file_ (`.flv`).
|
||||
|
||||
`--with-http_gzip_static_module`: Mengaktifkan **module GZIP static compression**.
|
||||
|
||||
`--with-http_random_index_module`: Mengaktifkan *module* untuk memilih file secara acak sebagai *index file* pada suatu direktori.
|
||||
`--with-http_random_index_module`: Mengaktifkan _module_ untuk memilih file secara acak sebagai _index file_ pada suatu direktori.
|
||||
|
||||
`--with-http_secure_link_module`: Mengaktifkan *module* untuk memeriksa request URL dengan *security token* yang dibutuhkan. (Mantap juga buat antisipasi **CSRF**)
|
||||
`--with-http_secure_link_module`: Mengaktifkan _module_ untuk memeriksa request URL dengan _security token_ yang dibutuhkan. (Mantap juga buat antisipasi **CSRF**)
|
||||
|
||||
`--with-http_stub_status_module`: Mengaktifkan *module* yang *menggenerate* server statistik dan informasi proses web server.
|
||||
`--with-http_stub_status_module`: Mengaktifkan _module_ yang _menggenerate_ server statistik dan informasi proses web server.
|
||||
|
||||
#### Miscellaneous options
|
||||
|
||||
|
@ -559,9 +567,9 @@ Menambahkan third-party module yang bisa di download dari internet. Misal dari [
|
|||
--add-module=/folder/ke/module/tambahan
|
||||
```
|
||||
|
||||
Seperti yang kita lihat, perintah yang cukup mudah untuk konfigurasi sebuah web server. Pada umunya kita hanya perlu untuk menambahkan **module SSL** untuk konten **HTTPS**, dan **"Real IP"** untuk mengambil alamat IP pengunjung jika menggunakan *proxy* atau kita menjalankan **Nginx** sebagai *backend server* dengan web server lain.
|
||||
Seperti yang kita lihat, perintah yang cukup mudah untuk konfigurasi sebuah web server. Pada umunya kita hanya perlu untuk menambahkan **module SSL** untuk konten **HTTPS**, dan **"Real IP"** untuk mengambil alamat IP pengunjung jika menggunakan _proxy_ atau kita menjalankan **Nginx** sebagai _backend server_ dengan web server lain.
|
||||
|
||||
Contoh untuk konfigurasi dengan semua *module* :
|
||||
Contoh untuk konfigurasi dengan semua _module_ :
|
||||
|
||||
```bash
|
||||
./configure --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module
|
||||
|
@ -569,6 +577,7 @@ Contoh untuk konfigurasi dengan semua *module* :
|
|||
|
||||
Untuk referensi bahan bacaan :
|
||||
|
||||
* [http://wiki.nginx.org/](http://wiki.nginx.org/)
|
||||
* [http://markmail.org/browse/ru.sysoev.nginx](http://markmail.org/browse/ru.sysoev.nginx)
|
||||
* [http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/](http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/)
|
||||
- [http://wiki.nginx.org/](http://wiki.nginx.org/)
|
||||
- [http://markmail.org/browse/ru.sysoev.nginx](http://markmail.org/browse/ru.sysoev.nginx)
|
||||
- [http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/](http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/)
|
||||
|
||||
|
|
|
@ -0,0 +1,562 @@
|
|||
---
|
||||
title: "Compiling the Latest Stable Version of Nginx from Source Code"
|
||||
description: "While Apache remains a popular choice for web servers, there are alternative options like Nginx that offer unique features and benefits. In this article, we'll explore how to compile the latest stable version of Nginx from its source code."
|
||||
summary: "While Apache remains a popular choice for web servers, there are alternative options like Nginx that offer unique features and benefits. In this article, we'll explore how to compile the latest stable version of Nginx from its source code."
|
||||
date: 2011-08-25T18:00:31+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- SysAdmin
|
||||
tags:
|
||||
- Nginx
|
||||
- Linux
|
||||
- SysVinit
|
||||
- Web Server
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
**Nginx**, a web server developed by **Igor Sysoev** in 2002, is a new alternative to **Apache**.
|
||||
|
||||
> _**NOTE**: This article was written in 2011, so you need to adapt in following this tutorial. Moreover, currently the majority of Linux distributions switched from `sysVinit` to `SystemD`._
|
||||
|
||||
Nginx (pronounced **"Engine X"**) is a lightweight web server and reverse proxy and email proxy with high performance, running on Windows, UNIX, GNU/Linux, Solaris, and BSD variants such as macOS.
|
||||
|
||||
## Why Nginx?
|
||||
|
||||
1. **Speed**: One core processor can efficiently handle thousands of connections, resulting in significantly reduced CPU load and memory consumption.
|
||||
|
||||
2. **Easy to use**: Configuration files are much easier to understand and modify than other web server configurations such as Apache. Just a few lines are enough to create a fairly complete `virtual host`.
|
||||
|
||||
3. **Plug-in system** (here referred to as "`modules`")
|
||||
|
||||
4. and most importantly, **Open Source** (BSD-like license)
|
||||
|
||||
Some examples of large websites that use Nginx either as a web server or as a reverse proxy to Apache include: **kaskus.us**, **indowebster.com**, **wordpress.com**, **sourceforge. net**, **github.com**, etc.
|
||||
|
||||
## Why compile?
|
||||
|
||||
In the web server installation process, several tools and parameters are required that we have to decide on during compilation, and several additional configurations that must be carried out and adapted to our system.
|
||||
|
||||
Well, this time we choose to download the source code of the application and install it manually rather than installing using the package manager. There are several reasons why people choose to install manually:
|
||||
|
||||
1. To get to know more about how the system (especially the web server) that we use works.
|
||||
2. (Probably) not yet available in the repositories of the Linux distribution being used.
|
||||
|
||||
Besides that, repositories rarely offer to download and install Nginx using the package manager (`yum`, `apt`, or `yast`) for the latest version (except on rolling-release distributions such as Arch Linux). Most provide old versions that are not up to date.
|
||||
|
||||
## Nginx Compilation Process
|
||||
|
||||
Below is a capture screen video that I made previously. Perhaps it can help in the installation process. (It doesn't need to be exactly the same; the important thing is to know the process and how it works.)
|
||||
|
||||
{{< youtube AtJ5OBOj1gE >}}
|
||||
|
||||
### Download source code
|
||||
|
||||
First, let's download our web server from [http://nginx.org/download/nginx-1.0.5.tar.gz](http://nginx.org/download/nginx-1.0.5.tar.gz) (when I wrote this article, the latest stable version was 1.0.5).
|
||||
|
||||
```bash
|
||||
wget http://nginx.org/download/nginx-1.0.5.tar.gz
|
||||
```
|
||||
|
||||
After that, copy the source to `/usr/local/src/` and extract it.
|
||||
|
||||
```bash
|
||||
sudo cp nginx-1.0.5.tar.gz /usr/local/src/
|
||||
cd /usr/local/src/
|
||||
sudo tar -xvzf nginx-1.0.5.tar.gz
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
|
||||
1. Before the installation process, it's better to check whether port 80 is being used or not. I'm using the BackTrack distro and by default Apache uses port 80 at startup. Run `/etc/init.d/apache2 stop` or `killall apache2`.
|
||||
2. Nginx is a program created using the C programming language, so to be able to compile it, we first need to have tools such as the GNU Compiler Collection (GCC) on our computer. GCC is usually installed on most Linux distros.
|
||||
|
||||
To confirm, just run the command `gcc` (without quotes) in the terminal. If you get output "gcc: no input files", it means GCC is already installed on your computer. If not, you need to install it first.
|
||||
|
||||
OK, let's continue...
|
||||
|
||||
### ./configure dan make install
|
||||
|
||||
Go to the `nginx-1.0.5` directory under `/usr/local/src/` directory and start compiling.
|
||||
|
||||
```bash
|
||||
cd nginx-1.0.5
|
||||
./configure
|
||||
```
|
||||
|
||||
By default, the **HTTP rewrite module** is automatically installed during the default Nginx installation. This module requires the **PCRE (Perl Compatible Regular Expression) library** because the **Rewrite** and **HTTP Core modules** of Nginx use PCRE as their _regular expression_ syntax.
|
||||
|
||||
Now it depends on our choice; if we:
|
||||
|
||||
1. require a rewrite module, we have to install PCRE first:
|
||||
|
||||
```bash
|
||||
apt-get install libpcre3 libpcre3-dev
|
||||
```
|
||||
|
||||
2. If we don't need it:
|
||||
|
||||
```bash
|
||||
./configure --without-http_rewrite_module
|
||||
```
|
||||
|
||||
Our choice fell on the first option because most of the sites we use needs the rewrite module. So after installing PCRE, we have to configure it again.
|
||||
|
||||
```bash
|
||||
./configure
|
||||
```
|
||||
|
||||
carry out the installation process:
|
||||
|
||||
```bash
|
||||
make && make install
|
||||
```
|
||||
|
||||
The default installation process that we did above will place the Nginx "workspace" in the `/usr/local/nginx` directory
|
||||
|
||||
### Creating a SysVinit Script for Nginx
|
||||
|
||||
Create a file with the name `nginx` in the `/etc/init.d/` directory:
|
||||
|
||||
```bash
|
||||
nano /etc/init.d/nginx
|
||||
```
|
||||
|
||||
Then copy and paste the shell script below, then save.
|
||||
|
||||
```bash
|
||||
#! /bin/sh
|
||||
### BEGIN INIT INFO
|
||||
# Provides: nginx
|
||||
# Required-Start: $all
|
||||
# Required-Stop: $all
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
# Short-Description: starts the nginx web server
|
||||
# Description: starts nginx using start-stop-daemon
|
||||
### END INIT INFO
|
||||
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||
DAEMON=/usr/local/nginx/sbin/nginx
|
||||
NAME=nginx
|
||||
DESC="nginx daemon"
|
||||
|
||||
test -x $DAEMON || exit 0
|
||||
|
||||
# Include nginx defaults if available
|
||||
if [ -f /etc/default/nginx ] ; then
|
||||
. /etc/default/nginx
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting $DESC: "
|
||||
start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
|
||||
--exec $DAEMON -- $DAEMON_OPTS
|
||||
echo "$NAME."
|
||||
;;
|
||||
stop)
|
||||
echo -n "Stopping $DESC: "
|
||||
start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
|
||||
--exec $DAEMON
|
||||
echo "$NAME."
|
||||
;;
|
||||
restart|force-reload)
|
||||
echo -n "Restarting $DESC: "
|
||||
start-stop-daemon --stop --quiet --pidfile \
|
||||
/usr/local/nginx/logs/nginx.pid --exec $DAEMON
|
||||
sleep 1
|
||||
start-stop-daemon --start --quiet --pidfile \
|
||||
/usr/local/nginx/logs/nginx.pid --exec $DAEMON -- $DAEMON_OPTS
|
||||
echo "$NAME."
|
||||
;;
|
||||
reload)
|
||||
echo -n "Reloading $DESC configuration: "
|
||||
start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
|
||||
--exec $DAEMON
|
||||
echo "$NAME."
|
||||
;;
|
||||
*)
|
||||
N=/etc/init.d/$NAME
|
||||
echo "Usage: $N {start|stop|restart|force-reload}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
exit 0
|
||||
```
|
||||
|
||||
`chmod +x` so that the script can be executed.
|
||||
|
||||
```bash
|
||||
chmod +x /etc/init.d/nginx
|
||||
```
|
||||
|
||||
After this, we can **start**, **stop**, **restart**, or **reload** the Nginx process via the script. Let's try running Nginx:
|
||||
|
||||
```bash
|
||||
/etc/init.d/nginx start
|
||||
```
|
||||
|
||||
Then, we should get a welcome message "Welcome to nginx!" when accessing `localhost` from your browser.
|
||||
|
||||
## Installation and configuration of PHP FastCGI (spawn-fcgi) with Nginx
|
||||
|
||||
Install `spawn-fcgi`.
|
||||
|
||||
```bash
|
||||
apt-get install php5-cgi spawn-fcgi
|
||||
```
|
||||
|
||||
After the installation process via the package manager is complete, create a file named `php-fastcgi` in the `/etc/init.d/` directory:
|
||||
|
||||
```bash
|
||||
nano /etc/init.d/php-fastcgi
|
||||
```
|
||||
|
||||
Copy and paste the shell init script below:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
BIND=127.0.0.1:9000
|
||||
USER=www-data
|
||||
PHP_FCGI_CHILDREN=15
|
||||
PHP_FCGI_MAX_REQUESTS=1000
|
||||
|
||||
PHP_CGI=/usr/bin/php-cgi
|
||||
PHP_CGI_NAME=`basename $PHP_CGI`
|
||||
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
|
||||
RETVAL=0
|
||||
|
||||
start() {
|
||||
echo -n "Starting PHP FastCGI: "
|
||||
start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
|
||||
RETVAL=$?
|
||||
echo "$PHP_CGI_NAME."
|
||||
}
|
||||
stop() {
|
||||
echo -n "Stopping PHP FastCGI: "
|
||||
killall -q -w -u $USER $PHP_CGI
|
||||
RETVAL=$?
|
||||
echo "$PHP_CGI_NAME."
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
start
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
;;
|
||||
restart)
|
||||
stop
|
||||
start
|
||||
;;
|
||||
*)
|
||||
echo "Usage: php-fastcgi {start|stop|restart}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
exit $RETVAL
|
||||
```
|
||||
|
||||
Don't forget to `chmod +x` so that the script can be executed.
|
||||
|
||||
```bash
|
||||
chmod +x /etc/init.d/php-fastcgi
|
||||
```
|
||||
|
||||
Then, before running `php-fastcgi`, we first build the website structure that we will use. (I chose the `/var/www/nginx` directory.)
|
||||
|
||||
```bash
|
||||
mkdir -p /var/www/nginx; cd nginx
|
||||
```
|
||||
|
||||
Create a file with the name `info.php` containing `phpinfo();` (just to test whether PHP is running or not):
|
||||
|
||||
```bash
|
||||
echo "<?php phpinfo(); ?>" > info.php
|
||||
```
|
||||
|
||||
Then, edit the Nginx configuration to suit the structure of the website we are building.
|
||||
|
||||
```bash
|
||||
nano /usr/local/nginx/conf/nginx.conf
|
||||
```
|
||||
|
||||
Because our root public HTML is in `/var/www/nginx`, then the configuration is as follows:
|
||||
|
||||
```nginx
|
||||
#user nobody;
|
||||
worker_processes 1;
|
||||
|
||||
#error_log logs/error.log;
|
||||
#error_log logs/error.log notice;
|
||||
#error_log logs/error.log info;
|
||||
|
||||
#pid logs/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
# '$status $body_bytes_sent "$http_referer" '
|
||||
# '"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
#access_log logs/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
#keepalive_timeout 0;
|
||||
keepalive_timeout 65;
|
||||
|
||||
#gzip on;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
#charset koi8-r;
|
||||
|
||||
#access_log logs/host.access.log main;
|
||||
|
||||
location / {
|
||||
root /var/www/nginx;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
#error_page 404 /404.html;
|
||||
|
||||
# redirect server error pages to the static page /50x.html
|
||||
#
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root html;
|
||||
}
|
||||
|
||||
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
|
||||
#
|
||||
#location ~ \.php$ {
|
||||
# proxy_pass http://127.0.0.1;
|
||||
#}
|
||||
|
||||
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
|
||||
#
|
||||
location ~ \.php$ {
|
||||
root html;
|
||||
fastcgi_pass 127.0.0.1:9000;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME /var/www/nginx$fastcgi_script_name;
|
||||
fastcgi_param PATH_INFO $fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
|
||||
# deny access to .htaccess files, if Apache's document root
|
||||
# concurs with nginx's one
|
||||
#
|
||||
#location ~ /\.ht {
|
||||
# deny all;
|
||||
#}
|
||||
}
|
||||
|
||||
|
||||
# another virtual host using mix of IP-, name-, and port-based configuration
|
||||
#
|
||||
#server {
|
||||
# listen 8000;
|
||||
# listen somename:8080;
|
||||
# server_name somename alias another.alias;
|
||||
|
||||
# location / {
|
||||
# root html;
|
||||
# index index.html index.htm;
|
||||
# }
|
||||
#}
|
||||
|
||||
|
||||
# HTTPS server
|
||||
#
|
||||
#server {
|
||||
# listen 443;
|
||||
# server_name localhost;
|
||||
|
||||
# ssl on;
|
||||
# ssl_certificate cert.pem;
|
||||
# ssl_certificate_key cert.key;
|
||||
|
||||
# ssl_session_timeout 5m;
|
||||
|
||||
# ssl_protocols SSLv2 SSLv3 TLSv1;
|
||||
# ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
# ssl_prefer_server_ciphers on;
|
||||
|
||||
# location / {
|
||||
# root html;
|
||||
# index index.html index.htm;
|
||||
# }
|
||||
#}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
Note that I changed the `root` and `fastcgi_param SCRIPT_FILENAME` configuration (video minute 7:00).
|
||||
|
||||
To test whether the configuration we created is correct, we can run the following command:
|
||||
|
||||
```bash
|
||||
/usr/local/nginx/sbin/nginx -t
|
||||
```
|
||||
|
||||
If the syntax and test are successful, then restart Nginx using the init file that we created earlier.
|
||||
|
||||
```bash
|
||||
/etc/init.d/nginx restart
|
||||
```
|
||||
|
||||
Test accessing the `info.php` file via the browser at `http://localhost/info.php`.
|
||||
|
||||
From there, we can determine whether Nginx can run and connect to PHP-FastCGI or not.
|
||||
|
||||
## Security Issue
|
||||
|
||||
In terms of computer and software security, we know that no system is perfect and free from bugs.
|
||||
|
||||
### Nginx “_no input file specified”_ PHP fast-cgi 0day Exploit
|
||||
|
||||
After Nginx and PHP CGI are running, try accessing http://localhost/whatever.php
|
||||
|
||||
If the browser displays "_No input file specified_", our configuration remains vulnerable and is not yet suitable for use.
|
||||
|
||||
**Exploit** : Create `anything.gif` file using **GIMP**. In the comment box, fill in the PHP _script_ `<?php phpinfo(); ?>` and place it in the nginx server root directory (in this article `/var/www/nginx/anything.gif`).
|
||||
|
||||
![Nginx 0day](nginx-0day.png#center)
|
||||
|
||||
Normally, if we access it from the browser `http://localhost/anything.gif` it will appear as a normal `.gif` image. But try accessing the URL from `http://localhost/anything.gif/whatever.php` then the results are amazing:
|
||||
|
||||
![Nginx 0day Exploit](nginx-0day-exploit.png#center)
|
||||
|
||||
The `.gif` file is executed as a PHP file (remember the _comment_ on the `.gif` file `<?php phpinfo(); ?>`).
|
||||
|
||||
Of course `http://localhost/anything.gif/whatever.php` doesn't actually exist. But every request that ends with `.php` will be **EXECUTED** as a PHP script by Nginx via the `cgi.fix_pathinfo` feature so that Nginx executes the `.gif` file as a PHP script!
|
||||
|
||||
How to overcome :
|
||||
|
||||
1. Change `cgi.fix_pathinfo=1` to `cgi.fix_pathinfo=0` in `php.ini`
|
||||
2. Edit `/usr/local/nginx/conf/nginx.conf` and add the following sctipt between _block_ `server { }`
|
||||
|
||||
```nginx
|
||||
error_page 400 402 403 404 /40x.html;
|
||||
location = /40x.html {
|
||||
root html;
|
||||
}
|
||||
```
|
||||
|
||||
## Modules
|
||||
|
||||
### Nginx Configure Module Options
|
||||
|
||||
During the configuration process, some modules will be enabled by default, and some need to be explicitly enabled.
|
||||
|
||||
#### Enabled by Default
|
||||
|
||||
The following modules are **enabled by default** when the `./configure` command is executed. To disable a module, add the commands below:
|
||||
|
||||
`--without-http_charset_module`: Disables _module_ _Charset_ for _re-encoding_ web pages.
|
||||
|
||||
`--without-http_gzip_module`: Disables _module_ **Gzip** compression.
|
||||
|
||||
`--without-http_ssi_module`: Disables **Server Side Include module**.
|
||||
|
||||
`--without-http_userid_module`: Disables the _User ID module_ which provides user identification using cookies.
|
||||
|
||||
`--without-http_access_module`: Disables the access restriction _module_ which allows us to configure access for a specific **IP range**. for example: `deny 192.168.1.1/24`.
|
||||
|
||||
`--without-http_auth_basic_module`: Disables **Basic Authentication module**. (like **Auth Basic Apache**)
|
||||
|
||||
`--without-http_autoindex_module`: Disables **Automatic Index module**.
|
||||
|
||||
`--without-http_geo_module`: Disables the _module_ that allows us to define _variables_ according to a specific **IP range**.
|
||||
|
||||
`--without-http_map_module`: This module allows us to classify a value into different values, storing the results in the form of a _variable_.
|
||||
|
||||
`--without-http_referer_module`: This module allows to block access based on the `http referer` _header_.
|
||||
|
||||
`--without-http_rewrite_module`: Disables the **Rewrite** module.
|
||||
|
||||
`--without-http_proxy_module`: Disables **HTTP proxy module** for transfer requests to another server (_reverse proxy_).
|
||||
|
||||
`--without-http_fastcgi_module`: Disables the _module_ for interaction with the **FastCGI** process.
|
||||
|
||||
`--without-http_memcached_module`: Disables the _module_ for interaction with the _memcache_ daemon.
|
||||
|
||||
`--without-http_limit_zone_module`: This module allows to limit the number of connections for a specific address / directory.
|
||||
|
||||
`--without-http_limit_req_module`: Disables **module limit requests** which allows us to limit the number of _requests per user_.
|
||||
|
||||
`--without-http_empty_gif_module`: Returns a 1px x 1px transparent `.gif` image. (very useful for web designers)
|
||||
|
||||
`--without-http_browser_module`: Disables the module that allows us to read the **User Agent** _string_.
|
||||
|
||||
`--without-http_upstream_ip_hash_module`: Disables the **IP-hash** module for load-balancing to the _upstream_ server.
|
||||
|
||||
#### Disabled by Default
|
||||
|
||||
The following modules are disabled by default. To enable these modules, add the commands below:
|
||||
|
||||
`--with-http_ssl_module`: Enables **SSL module** for websites using the `https://` protocol.
|
||||
|
||||
`--with-http_realip_module`: Enables the _module_ to read the actual IP address of a request (usually obtained from the **HTTP header** _trusted proxy_).
|
||||
|
||||
`--with-http_addition_module`: Enables _module_ which allows us to add data to website pages.
|
||||
|
||||
`--with-http_xslt_module`: Enables _module_ for XSL to XML transformation. Note: Need to install `libxml2` and `libxslt` _library_.
|
||||
|
||||
`--with-http_image_filter_module`: Enables the _module_ that allows us to modify images. Note: Need to install `libgd` _library_ for this _module_.
|
||||
|
||||
`--with-http_sub_module`: Enables the _module_ to perform _replace_ text in a web page.
|
||||
|
||||
`--with-http_dav_module`: Enables the **WebDAV** feature
|
||||
|
||||
`--with-http_flv_module`: Enables a special _module_ to _handle_ _flash video files_ (`.flv`).
|
||||
|
||||
`--with-http_gzip_static_module`: Enables **module GZIP static compression**.
|
||||
|
||||
`--with-http_random_index_module`: Enables the _module_ to randomly select a file as the _index file_ in a directory.
|
||||
|
||||
`--with-http_secure_link_module`: Enables the _module_ to check URL requests with the required _security token_. (Also great for anticipating **CSRF**)
|
||||
|
||||
`--with-http_stub_status_module`: Enables a _module_ that _generates_ server statistics and web server process information.
|
||||
|
||||
#### Miscellaneous options
|
||||
|
||||
`--with-ipv6`: Enable IPv6 support
|
||||
|
||||
As we can see, configuring a web server is quite easy. In general, we only need to add an **SSL module** for serving HTTPS content and "Real IP" to retrieve the visitor's IP address if we use a proxy or run Nginx as a backend server with another web server.
|
||||
|
||||
Example of configuration with all modules:
|
||||
|
||||
```bash
|
||||
./configure --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module
|
||||
```
|
||||
|
||||
references:
|
||||
|
||||
- [http://wiki.nginx.org/](http://wiki.nginx.org/)
|
||||
- [http://markmail.org/browse/ru.sysoev.nginx](http://markmail.org/browse/ru.sysoev.nginx)
|
||||
- [http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/](http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/)
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Firewall iptables Port Knocking"
|
||||
description: "Berbagi tips untuk meningkatkan keamanan server dengan menggunakan teknik port knocking iptables firewall."
|
||||
summary: "Berbagi tips untuk meningkatkan keamanan server dengan menggunakan teknik port knocking iptables firewall."
|
||||
# linkTitle:
|
||||
date: 2013-07-01T22:16:19+07:00
|
||||
lastmod:
|
||||
|
@ -34,21 +35,19 @@ authors:
|
|||
- ditatompel
|
||||
---
|
||||
|
||||
Kali ini saya ingin berbagi tips untuk meningkatkan keamanan server dengan menggunakan teknik **port knocking**. **Port knocking** adalah sebuah cara untuk membuka *port* tertentu dengan cara mengirimkan paket ke sedetetan port-port tertentu yang telah ditentukan sebelumnya.
|
||||
|
||||
<!--more-->
|
||||
Kali ini saya ingin berbagi tips untuk meningkatkan keamanan server dengan menggunakan teknik **port knocking**. **Port knocking** adalah sebuah cara untuk membuka _port_ tertentu dengan cara mengirimkan paket ke sedetetan port-port tertentu yang telah ditentukan sebelumnya.
|
||||
|
||||
> _**Q** : Tujuannya untuk apa?_
|
||||
|
||||
**A** : Tujuannya untuk menghindari serangan dari *pentester* yang melakukan *scanning port* untuk mendapatkan *service-service* yang mungkin bisa diexploitasi oleh mereka. Karena jika *pentester* yang melakukan *scanning* tersebut tidak mengetuk *port* yang telah ditentukan sebelumnya secara berurutan, maka *port* yang ingin kita lindungi tersebut tidak akan terbuka.
|
||||
**A** : Tujuannya untuk menghindari serangan dari _pentester_ yang melakukan _scanning port_ untuk mendapatkan _service-service_ yang mungkin bisa diexploitasi oleh mereka. Karena jika _pentester_ yang melakukan _scanning_ tersebut tidak mengetuk _port_ yang telah ditentukan sebelumnya secara berurutan, maka _port_ yang ingin kita lindungi tersebut tidak akan terbuka.
|
||||
|
||||
> _**Q** : Bisa lebih detail?_
|
||||
|
||||
**A** : Misalnya kita punya *service* **SSH** yang listen di *port* `22`, sedangkan *pentester* punya *0day remote root exploit* untuk aplikasi **OpenSSH** tersebut misalnya. Maka server akan terancam keamanannya karena port `22` tersebut terbuka. Dengan menggunakan teknik *port knocking*, hanya mereka yang mengetahui port mana yang harus di *"hit"* terlebih dahulu yang dapat membuka dan mengakses port `22` tersebut.
|
||||
**A** : Misalnya kita punya _service_ **SSH** yang listen di _port_ `22`, sedangkan _pentester_ punya _0day remote root exploit_ untuk aplikasi **OpenSSH** tersebut misalnya. Maka server akan terancam keamanannya karena port `22` tersebut terbuka. Dengan menggunakan teknik _port knocking_, hanya mereka yang mengetahui port mana yang harus di _"hit"_ terlebih dahulu yang dapat membuka dan mengakses port `22` tersebut.
|
||||
|
||||
Supaya lebih jelas, saya ambil contoh dari *thread* saya sebelumnya tentang **celeng Lawang Sewu CTF** (`http://devilzc0de.org/forum/thread-20071.html`). Challange yang ke-2 adalah mengenai *port knocking*.
|
||||
Supaya lebih jelas, saya ambil contoh dari _thread_ saya sebelumnya tentang **celeng Lawang Sewu CTF** (`http://devilzc0de.org/forum/thread-20071.html`). Challange yang ke-2 adalah mengenai _port knocking_.
|
||||
|
||||
*Port knocking* ini bisa kita konfigurasi dengan `iptables` *firewall* (yang biasanya sudah dimiliki *kernel Linux* pada kebanyakan distro linux).
|
||||
_Port knocking_ ini bisa kita konfigurasi dengan `iptables` _firewall_ (yang biasanya sudah dimiliki _kernel Linux_ pada kebanyakan distro linux).
|
||||
|
||||
Pada kesempatan kali ini saya share bagaimana **cara konfigurasi port knocking menggunakan `iptables`**.
|
||||
|
||||
|
@ -57,80 +56,90 @@ Pada kesempatan kali ini saya share bagaimana **cara konfigurasi port knocking m
|
|||
VIDEO TUTORIAL : [http://youtu.be/0zFQocf7C_0](http://youtu.be/0zFQocf7C_0).
|
||||
|
||||
Yang dibutuhkan pada tutorial kali ini :
|
||||
|
||||
- Server & Client dengan **OS Linux** (pada tutorial kali ini ane menggunakan **CentOS**)
|
||||
- `iptables` (server firewall)
|
||||
- `nmap` (untuk *scan* dan *knocking port* dari *client*)
|
||||
- Pengetahuan dasar mengenai *iptables*.
|
||||
- `nmap` (untuk _scan_ dan _knocking port_ dari _client_)
|
||||
- Pengetahuan dasar mengenai _iptables_.
|
||||
|
||||
**Studi Kasus:**
|
||||
|
||||
Saya punya sebuah server (IP : `192.168.0.100`), saya menggunakan SSH untuk melakukan manajemen server tersebut. SSH port untuk *remote* aksesnya adalah default (Port `22`). Saya ingin menutup port `22` dan hanya terbuka pada saat dibutuhkan.
|
||||
Saya punya sebuah server (IP : `192.168.0.100`), saya menggunakan SSH untuk melakukan manajemen server tersebut. SSH port untuk _remote_ aksesnya adalah default (Port `22`). Saya ingin menutup port `22` dan hanya terbuka pada saat dibutuhkan.
|
||||
|
||||
Disinilah kita gunakan teknik *port knocking*, dimana saya sudah menge-set konfigurasi supaya user harus mengirimkan paket **TCP** ke port (misalnya) `1111` lalu `2222`, lalu `3333`, dan terakhir `4444` baru kembudian port `22` (SSH) tersebut terbuka.
|
||||
Disinilah kita gunakan teknik _port knocking_, dimana saya sudah menge-set konfigurasi supaya user harus mengirimkan paket **TCP** ke port (misalnya) `1111` lalu `2222`, lalu `3333`, dan terakhir `4444` baru kembudian port `22` (SSH) tersebut terbuka.
|
||||
|
||||
- IP Server : `192.168.0.100`.
|
||||
- OS : **CentOS**.
|
||||
- SSH Port : `22`.
|
||||
- Skema **Port Knocking** : Paket `TCP` Port `1111` => `2222` => `3333` => `4444` => Port `22` terbuka.
|
||||
|
||||
Untuk bawaan server **CentOS**, konfigurasi *firewall* sudah membuka port `22` untuk SSH.
|
||||
Untuk bawaan server **CentOS**, konfigurasi _firewall_ sudah membuka port `22` untuk SSH.
|
||||
|
||||
![Port 22 open](pk-01.png#center)
|
||||
|
||||
Maka kita perlu mengkonfigurasi ulang `iptables` *firewall*nya. Kita dapat menggunakan perintah `iptables-save > iptables.rules` untuk melakukan *dump* / *backup rules firewall*.
|
||||
Maka kita perlu mengkonfigurasi ulang `iptables` *firewall*nya. Kita dapat menggunakan perintah `iptables-save > iptables.rules` untuk melakukan _dump_ / _backup rules firewall_.
|
||||
|
||||
Coba lihat pada hasil konfigurasi *firewall* yang baru saja kita *dump*, kurang lebih seperti berikut (untuk **CentOS**):
|
||||
Coba lihat pada hasil konfigurasi _firewall_ yang baru saja kita _dump_, kurang lebih seperti berikut (untuk **CentOS**):
|
||||
|
||||
```plain
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
|
||||
-A INPUT -j REJECT --reject-with icmp-host-prohibited
|
||||
-A INPUT -j REJECT --reject-with icmp-host-prohibited
|
||||
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
|
||||
```
|
||||
|
||||
![iptables dump config](pk-02.png#center)
|
||||
|
||||
Perhatikan pada rules berikut :
|
||||
|
||||
```plain
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
|
||||
```
|
||||
|
||||
terlihat bahwa iptables memperbolehkan akses melalui port 22.
|
||||
|
||||
Mari kita buat `iptables` *rules* sesuai keinginan kita di studi kasus ini, yaitu kita ingin menutup port `22` tersebut, dan hanya terbuka pada saat port `1111`,`2222`,`3333`,`4444` mendapatkan paket `TCP` secara berurutan.
|
||||
Mari kita buat `iptables` _rules_ sesuai keinginan kita di studi kasus ini, yaitu kita ingin menutup port `22` tersebut, dan hanya terbuka pada saat port `1111`,`2222`,`3333`,`4444` mendapatkan paket `TCP` secara berurutan.
|
||||
|
||||
Copy `iptables.rules` yang sebelumnya sudah kita dapatkan ke `iptables-new.rules`, kemudian edit.
|
||||
|
||||
```bash
|
||||
cp iptables.rules iptables-new.rules
|
||||
vi iptables-new.rules
|
||||
```
|
||||
|
||||
dan edit seperti pada gambar dibawah :
|
||||
|
||||
![iptables port knocking rules](pk-03.png#center)
|
||||
|
||||
Dengan kata lain, saya membuka port `80`, kemudian menambahkan *firewall rules* baru yang secara dinamis dapat membuka port `22` selama 15 detik jika port `1111`, `2222`, `3333`, `4444` mendapatkan kiriman paket `TCP` secara berurutan dalam jangka waktu 5 detik.
|
||||
Dengan kata lain, saya membuka port `80`, kemudian menambahkan _firewall rules_ baru yang secara dinamis dapat membuka port `22` selama 15 detik jika port `1111`, `2222`, `3333`, `4444` mendapatkan kiriman paket `TCP` secara berurutan dalam jangka waktu 5 detik.
|
||||
|
||||
Setelah dirasa udah oke, kita restore konfigurasi firewall yang baru dengan menggunakan `iptables-restore`, lalu *restart iptables service*nya.
|
||||
|
||||
```bash
|
||||
iptables-restore < iptables-new.rules
|
||||
service iptables save
|
||||
service iptables restart
|
||||
```
|
||||
|
||||
kemudian untuk memastikan rules yang baru sudah berjalan gunakan perintah :
|
||||
|
||||
```bash
|
||||
iptables -L -n
|
||||
```
|
||||
|
||||
![iptables rules list](pk-04.png#center)
|
||||
|
||||
Nah kalau udah, mari kita coba cek scan port `22` pada server dari komputer kita menggunakan `nmap`, maka akan terlihat port tersebut tertutup oleh *firewall*.
|
||||
Nah kalau udah, mari kita coba cek scan port `22` pada server dari komputer kita menggunakan `nmap`, maka akan terlihat port tersebut tertutup oleh _firewall_.
|
||||
|
||||
```bash
|
||||
nmap -Pn 192.168.0.100 -p22
|
||||
```
|
||||
|
||||
![nmap port 22](pk-05.png#center)
|
||||
|
||||
Setelah itu kita buat **script bash** sederhana untuk melakukan *knocking port*.
|
||||
Setelah itu kita buat **script bash** sederhana untuk melakukan _knocking port_.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
@ -142,29 +151,27 @@ do
|
|||
done
|
||||
```
|
||||
|
||||
Simpan dengan nama `knock.sh` lalu `chmod +x` agar *script* tersebut dapat dieksekusi.
|
||||
Simpan dengan nama `knock.sh` lalu `chmod +x` agar _script_ tersebut dapat dieksekusi.
|
||||
|
||||
cara penggunaan:
|
||||
|
||||
```bash
|
||||
# ./knock.sh [ip server] [list port]
|
||||
# misalnya:
|
||||
./knock.sh 192.168.0.100 1111 2222 3333 4444
|
||||
```
|
||||
|
||||
Dengan mengetuk port `1111`, `2222`, `3333`, `4444` secara berurutan maka port `22` yang telah kita tentukan dari *rules firewall* akan terbuka. Dengan begitu kita dapat melakukan koneksi SSH ke server.
|
||||
Dengan mengetuk port `1111`, `2222`, `3333`, `4444` secara berurutan maka port `22` yang telah kita tentukan dari _rules firewall_ akan terbuka. Dengan begitu kita dapat melakukan koneksi SSH ke server.
|
||||
|
||||
![nmap port knocking](pk-06.png#center)
|
||||
|
||||
Sekian tutorial mengenai port knocking.
|
||||
|
||||
Silahkan dikembangkan sendiri dengan kreatifitas masing2, *protocol* dan paket yang dikirimkan tidak hanya terbatas pada **TCP** saja, kita juga bisa memanfaatkan kombinasi protokol **TCP**, **UDP** atau bahkan **ICMP**.
|
||||
Silahkan dikembangkan sendiri dengan kreatifitas masing2, _protocol_ dan paket yang dikirimkan tidak hanya terbatas pada **TCP** saja, kita juga bisa memanfaatkan kombinasi protokol **TCP**, **UDP** atau bahkan **ICMP**.
|
||||
|
||||
Referensi:
|
||||
|
||||
- [http://en.wikipedia.org/wiki/Port_knocking](http://en.wikipedia.org/wiki/Port_knocking)
|
||||
- [http://www.faqs.org/docs/iptables/index.html](http://www.faqs.org/docs/iptables/index.html)
|
||||
- [https://wiki.archlinux.org/index.php/Port_Knocking](https://wiki.archlinux.org/index.php/Port_Knocking)
|
||||
- Tambahan dari om @[od3yz]: [http://www.overflow.web.id/source/Metode-Port-Knocking-dengan-Iptables.pdf](http://www.overflow.web.id/source/Metode-Port-Knocking-dengan-Iptables.pdf)
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
165
content/tutorials/firewall-iptables-port-knocking/index.md
Normal file
165
content/tutorials/firewall-iptables-port-knocking/index.md
Normal file
|
@ -0,0 +1,165 @@
|
|||
---
|
||||
title: "Implementing Firewall Protection via Iptables Port Knocking"
|
||||
description: "Strengthening server security by leveraging port knocking techniques in conjunction with iptables firewall functionality."
|
||||
summary: "Strengthening server security by leveraging port knocking techniques in conjunction with iptables firewall functionality."
|
||||
date: 2013-07-01T22:16:19+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- SysAdmin
|
||||
- Security
|
||||
tags:
|
||||
- iptables
|
||||
- Port Knocking
|
||||
- Linux
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
This time, I'd like to share some tips on how to enhance server security by utilizing the technique of _port knocking_. Port knocking is a method for opening a specific port by sending packets to predetermined ports beforehand.
|
||||
|
||||
> _Q: What's the purpose?_
|
||||
|
||||
A: The objective is to thwart attacks from penetration testers who conduct port scanning to identify services that might be exploitable by them. If the penetration tester fails to knock on the previously designated ports in sequence, the protected port will remain inaccessible.
|
||||
|
||||
> _Q: Can you elaborate?_
|
||||
|
||||
A: For instance, suppose we have an SSH service listening on port 22, while the penetration tester has a 0-day remote root exploit for OpenSSH. Therefore, our server's security is at risk due to the open port 22. By employing the technique of port knocking, only those who know which ports to "hit" first can
|
||||
unlock and access port 22.
|
||||
|
||||
To clarify, I'll provide an example from my previous thread about **Lawang Sewu CTF** (`http://devilzc0de.org/forum/thread-20071.html`). The second challenge involves port knocking.
|
||||
|
||||
This port knocking technique can be configured using the iptables firewall, which is typically already possessed by the Linux kernel on most Linux distributions.
|
||||
|
||||
On this occasion, I'll share how to configure port knocking with iptables.
|
||||
|
||||
> **Disclaimer**: By following this tutorial, the author have no responsibility for any errors or loss of remote access to the server.
|
||||
|
||||
VIDEO TUTORIAL : [http://youtu.be/0zFQocf7C_0](http://youtu.be/0zFQocf7C_0).
|
||||
|
||||
What you need for this tutorial:
|
||||
|
||||
- Server & Client with Linux OS (in this tutorial, I'm using CentOS)
|
||||
- `iptables` (server firewall)
|
||||
- `nmap` (for scanning and knocking ports from the client)
|
||||
- Basic knowledge of `iptables`
|
||||
|
||||
**Case Study:**
|
||||
|
||||
I have a server with IP address `192.168.0.100`, and I'm using SSH for remote management of that server. The default SSH port for remote access is `22`. I want to close port `22` and only make it available when needed.
|
||||
|
||||
This is where we use the technique of port knocking, which I've already set up so that users need to send a TCP packet to, for example, ports `1111`, then `2222`, then `3333`, and finally `4444` before port `22` (SSH) becomes accessible.
|
||||
|
||||
- Server IP: `192.168.0.100`.
|
||||
- OS: **CentOS**.
|
||||
- SSH Port: `22`.
|
||||
- **Port Knocking** Scheme: TCP packet to ports `1111` => `2222` => `3333` => `4444` => Port `22` becomes accessible.
|
||||
|
||||
By default, the CentOS server's firewall has already opened port 22 for SSH.
|
||||
|
||||
![Port 22 open](pk-01.png#center)
|
||||
|
||||
So we need to reconfigure the `iptables` firewall. We can use the command `iptables-save > iptables.rules` to perform a dump/back up of the firewall rules.
|
||||
|
||||
Let's take a look at the new firewall configuration that we just dumped, which is roughly as follows (for CentOS):
|
||||
|
||||
```plain
|
||||
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
|
||||
-A INPUT -p icmp -j ACCEPT
|
||||
-A INPUT -i lo -j ACCEPT
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
|
||||
-A INPUT -j REJECT --reject-with icmp-host-prohibited
|
||||
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
|
||||
```
|
||||
|
||||
![iptables dump config](pk-02.png#center)
|
||||
|
||||
Note the following firewall rules:
|
||||
|
||||
```plain
|
||||
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
|
||||
```
|
||||
|
||||
It appears that `iptables` allows access through port 22.
|
||||
|
||||
Let's create an `iptables` rule according to our wishes in this case study, namely we want to close port `22` and only make it accessible when ports `1111`, `2222`, `3333`, and `4444` receive a sequential TCP packet.
|
||||
|
||||
Copy the previous `iptables.rules` file to `iptables-new.rules`, then edit:
|
||||
|
||||
```bash
|
||||
cp iptables.rules iptables-new.rules
|
||||
vi iptables-new.rules
|
||||
```
|
||||
|
||||
and edit it as shown below:
|
||||
|
||||
![iptables port knocking rules](pk-03.png#center)
|
||||
|
||||
In other words, I opened port `80`, then added a new firewall rule that dynamically opens port `22` for 15 seconds if ports `1111`, `2222`, `3333`, and `4444` receive sequential TCP packets within a 5-second timeframe.
|
||||
|
||||
After it's deemed okay, we restore the new firewall configuration using `iptables-restore`, then restart the iptables service.
|
||||
|
||||
```bash
|
||||
iptables-restore < iptables-new.rules
|
||||
service iptables save
|
||||
service iptables restart
|
||||
```
|
||||
|
||||
Then, to ensure the new rules are running, use the command:
|
||||
|
||||
```bash
|
||||
iptables -L -n
|
||||
```
|
||||
|
||||
![iptables rules list](pk-04.png#center)
|
||||
|
||||
Now that's done, let's try checking port `22` on our server from our computer using `nmap`, and it will show that the port is closed by the firewall.
|
||||
|
||||
```bash
|
||||
nmap -Pn 192.168.0.100 -p22
|
||||
```
|
||||
|
||||
![nmap port 22](pk-05.png#center)
|
||||
|
||||
After that, we'll create a simple bash script to perform port knocking.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
HOST=$1
|
||||
shift
|
||||
for ARG in "$@"
|
||||
do
|
||||
nmap -PN --host_timeout 201 --max-retries 0 -p $ARG $HOST
|
||||
done
|
||||
```
|
||||
|
||||
Save it as `knock.sh` and then run `chmod +x` so that the script can be executed.
|
||||
|
||||
Usage:
|
||||
|
||||
```bash
|
||||
# ./knock.sh [ip server] [list port]
|
||||
# Example:
|
||||
./knock.sh 192.168.0.100 1111 2222 3333 4444
|
||||
```
|
||||
|
||||
By knocking on ports `1111`, `2222`, `3333`, and `4444` in sequence, the port `22` we specified in the firewall rules will become accessible. This way, you can establish an SSH connection to the server.
|
||||
|
||||
![nmap port knocking](pk-06.png#center)
|
||||
|
||||
That's it for this port knocking tutorial.
|
||||
|
||||
Feel free to develop it further on your own with creativity, using a combination of protocols such as **TCP**, **UDP**, or even **ICMP**.
|
||||
|
||||
Reference:
|
||||
|
||||
- [http://en.wikipedia.org/wiki/Port_knocking](http://en.wikipedia.org/wiki/Port_knocking)
|
||||
- [http://www.faqs.org/docs/iptables/index.html](http://www.faqs.org/docs/iptables/index.html)
|
||||
- [https://wiki.archlinux.org/index.php/Port_Knocking](https://wiki.archlinux.org/index.php/Port_Knocking)
|
||||
- Additional resource by **@od3yz**: [http://www.overflow.web.id/source/Metode-Port-Knocking-dengan-Iptables.pdf](http://www.overflow.web.id/source/Metode-Port-Knocking-dengan-Iptables.pdf)
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Generate Custom Wordlist Dari Situs Target, My Own Brute Way"
|
||||
description: Kadang seorang administrator menggunakan password dengan kata dari website mereka. entah itu dari nama perusahaan, organisasi atau nama produk unggulan mereka. Berikut ini tutorial cara untuk men-download website dan mengubahnya menjadi sebuah wordlist.
|
||||
description: Tutorial cara untuk men-download website dan mengubahnya menjadi sebuah wordlist.
|
||||
summary: Tutorial cara untuk men-download website dan mengubahnya menjadi sebuah wordlist.
|
||||
# linkTitle:
|
||||
date: 2011-10-01T22:36:55+07:00
|
||||
lastmod:
|
||||
|
@ -8,10 +9,6 @@ draft: false
|
|||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
# nav_icon:
|
||||
# vendor: bootstrap
|
||||
# name: toggles
|
||||
# color: '#e24d0e'
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
|
@ -22,23 +19,15 @@ tags:
|
|||
- Wyd
|
||||
- BackTrack
|
||||
images:
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
- https://edge.ditatompel.com/assets/img/site-contents/generate-custom-wordlist/feature-my-own-brute-way.jpeg
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Kadang seorang Sistem Administrator menggunakan password dengan kata dari website mereka. entah itu dari nama perusahaan, organisasi atau nama produk unggulan mereka. Berikut ini tutorial cara untuk *men-download* website dan mengubahnya menjadi sebuah *wordlist*.
|
||||
Kadang seorang Sistem Administrator menggunakan password dengan kata dari website mereka. entah itu dari nama perusahaan, organisasi atau nama produk unggulan mereka. Berikut ini tutorial cara untuk _men-download_ website dan mengubahnya menjadi sebuah _wordlist_.
|
||||
|
||||
<!--more-->
|
||||
_Tools_ yang diperlukan:
|
||||
|
||||
*Tools* yang diperlukan:
|
||||
1. [Wyd](http://packetstormsecurity.org/files/51130/wyd.tar.gz.html)
|
||||
2. [Hydra](http://thc.org/thc-hydra/)
|
||||
3. [Cupp](http://ls-la.ditatompel.crayoncreative.net/linux/cupp-3.0.tar.gz)
|
||||
|
@ -46,14 +35,19 @@ Kadang seorang Sistem Administrator menggunakan password dengan kata dari websit
|
|||
Untuk para pengguna **BackTrack**, tidak perlu repot menginstall semua tools tersebut. Untuk Distro lain, bisa mengikuti langkah-langkah berikut.
|
||||
|
||||
## Download semua konten situs
|
||||
|
||||
Pertama kita buat dulu direktori kerja
|
||||
|
||||
```bash
|
||||
mkdir ~/custom-wl; cd ~/custom-wl
|
||||
```
|
||||
|
||||
Download semua isi konten website target dengan wget sampai selesai, misal situs target kita adalah `http://ditatompel.crayoncreative.net`:
|
||||
|
||||
```bash
|
||||
wget -r http://ditatompel.crayoncreative.net
|
||||
```
|
||||
|
||||
```
|
||||
<blah blah blah . . . . .>
|
||||
FINISHED --2011-10-01 12:55:41--
|
||||
|
@ -63,6 +57,7 @@ Downloaded: 602 files, 19M in 6m 21s (51.2 KB/s)
|
|||
File2 tersebut akan disimpan di direktori `~/custom-wl/[domain-situs]` atau dalam tutorial kali ini `~/custom-wl/ditatompel.crayoncreative.net`.
|
||||
|
||||
## Menggunakan wyd.pl
|
||||
|
||||
Kemudian ambil dan siapkan senjata perang utama kita : `wyd.pl` ( Pengguna **BackTrack** tidak perlu download karena sudah ada di `/pentest/password`).
|
||||
|
||||
```bash
|
||||
|
@ -72,7 +67,7 @@ cd wyd
|
|||
perl wyd.pl -n -o ~/custom-wl/wordlist-mentah.txt ~/custom-wl/ditatompel.crayoncreative.net
|
||||
```
|
||||
|
||||
![Custom Wordlist 1](custom-wordlist1.jpg#center)
|
||||
![Custom Wordlist 1](https://edge.ditatompel.com/assets/img/site-contents/generate-custom-wordlist/custom-wordlist1.jpg#center)
|
||||
|
||||
Nah, kita punya file berisi kata-kata dari situs target, dan senjata utama juga sudah beraksi. Tapi masih ada yang kurang nih bro..
|
||||
|
||||
|
@ -80,16 +75,18 @@ Nah, kita punya file berisi kata-kata dari situs target, dan senjata utama juga
|
|||
less ~/custom-wl/wordlist-mentah.txt
|
||||
```
|
||||
|
||||
kata-kata yang digenerate sama `wyd.pl` tadi masih banyak yang kembar. Kita rapikan dulu dengan menggunakan perintah `uniq` supaya nantinya kita tidak mengorbankan *memory usage*.
|
||||
kata-kata yang digenerate sama `wyd.pl` tadi masih banyak yang kembar. Kita rapikan dulu dengan menggunakan perintah `uniq` supaya nantinya kita tidak mengorbankan _memory usage_.
|
||||
|
||||
```bash
|
||||
cat ~/custom-wl/wordlist-mentah.txt | uniq > ~/custom-wl/wordlist-setengah-matang.txt
|
||||
```
|
||||
|
||||
## Install Hydra, `pw-inspector`
|
||||
|
||||
Oke, sekarang *wordlist* kita sudah agak rapi. Kita pilihin lagi nih bro supaya *script2* tanpa spasi seperti `jquery.min.js` ga ikut masuk ke dalam *wordlist*. Caranya kita buang *wordlist* yang hurufnya kurang dari 5 dan lebih dari 30 (karena jarang orang punya password lebih dari 30 karakter) menggunakan alat `pw-inspector` (didapat dari fiturnya **Hydra**, jadi klo yang belum punya **Hydra** download dan install dulu).
|
||||
Oke, sekarang _wordlist_ kita sudah agak rapi. Kita pilihin lagi nih bro supaya _script2_ tanpa spasi seperti `jquery.min.js` ga ikut masuk ke dalam _wordlist_. Caranya kita buang _wordlist_ yang hurufnya kurang dari 5 dan lebih dari 30 (karena jarang orang punya password lebih dari 30 karakter) menggunakan alat `pw-inspector` (didapat dari fiturnya **Hydra**, jadi klo yang belum punya **Hydra** download dan install dulu).
|
||||
|
||||
Install Hydra :
|
||||
|
||||
```bash
|
||||
wget http://www.thc.org/releases/hydra-7.0-src.tar.gz -O /usr/local/src/hydra-7.0-src.tar.gz
|
||||
cd /usr/local/src/; tar -xvzf hydra-7.0-src.tar.gz
|
||||
|
@ -97,16 +94,19 @@ cd hydra-7.0-src
|
|||
./configure
|
||||
make && make install
|
||||
```
|
||||
Buang *wordlist* yang hurufnya kurang dari 5 dan lebih dari 30 :
|
||||
|
||||
Buang _wordlist_ yang hurufnya kurang dari 5 dan lebih dari 30 :
|
||||
|
||||
```bash
|
||||
cat ~/custom-wl/wordlist-setengah-matang.txt | pw-inspector -m 5 -M 30 > ~/custom-wl/wordlist-oke.txt
|
||||
```
|
||||
|
||||
Nah sekarang udah lumayan rapi *wordlist* kita. Bro2 sekalian bisa pilih-pilih lagi tuh *wordlist*. Klo wordlistnya cukup besar, buka pake vi / editor spt kate bisa makan banyak *memory*, atau kita bisa gunakan `head -n 25 wordlist.txt` Untuk melihat 25 baris pertama atau `tail -n 25 wordlist.txt` untuk melihat 25 baris terakhir (optional).
|
||||
Nah sekarang udah lumayan rapi _wordlist_ kita. Bro2 sekalian bisa pilih-pilih lagi tuh _wordlist_. Klo wordlistnya cukup besar, buka pake vi / editor spt kate bisa makan banyak _memory_, atau kita bisa gunakan `head -n 25 wordlist.txt` Untuk melihat 25 baris pertama atau `tail -n 25 wordlist.txt` untuk melihat 25 baris terakhir (optional).
|
||||
|
||||
## Menggunakan CUPP
|
||||
|
||||
Lalu sebagai pemanis kita jalanin uler kadut yang di **BackTrack** juga udah eksis, **CUPP**. Yang belum punya **CUPP** bisa download dulu :
|
||||
|
||||
```bash
|
||||
wget http://ls-la.ditatompel.crayoncreative.net/linux/cupp-3.0.tar.gz -O ~/custom-wl/cupp-3.0.tar.gz
|
||||
cd ~/custom-wl/; tar -xvzf cupp-3.0.tar.gz
|
||||
|
@ -114,6 +114,7 @@ cd cupp; python cupp.py -w ~/custom-wl/wordlist-oke.txt
|
|||
```
|
||||
|
||||
Jawab pertanyaan dari sang juru kunci ini. Outputnya kurang lebih seperti ini :
|
||||
|
||||
```
|
||||
> Do you want to concatenate all words from wordlist? Y/[N]: N
|
||||
> Do you want to add special chars at the end of words? Y/[N]: N
|
||||
|
@ -126,10 +127,11 @@ Jawab pertanyaan dari sang juru kunci ini. Outputnya kurang lebih seperti ini :
|
|||
[+] Now load your pistolero with /root/custom-wl/wordlist-oke.txt.cupp.txt and shoot! Good luck!
|
||||
```
|
||||
|
||||
![Custom Wordlist 2](custom-wordlist2.jpg#center)
|
||||
![Custom Wordlist 2](https://edge.ditatompel.com/assets/img/site-contents/generate-custom-wordlist/custom-wordlist2.jpg#center)
|
||||
|
||||
Nah sampai di sini dulu.. Untuk bruteforcenya pasti udah pada punya tools favorit masing2.
|
||||
|
||||
## Referensi
|
||||
* Ebook **Cracking Passwords** by: **J. Dravet**
|
||||
* [http://thc.org/thc-hydra/README](http://thc.org/thc-hydra/README)
|
||||
|
||||
- Ebook **Cracking Passwords** by: **J. Dravet**
|
||||
- [http://thc.org/thc-hydra/README](http://thc.org/thc-hydra/README)
|
||||
|
|
|
@ -6,7 +6,8 @@ date: 2023-06-05T19:04:57+07:00
|
|||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
featured: true
|
||||
featured: false
|
||||
pinned: true
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
# nav_icon:
|
||||
|
@ -37,10 +38,9 @@ authors:
|
|||
- vie
|
||||
---
|
||||
|
||||
Cukup menggunakan VPS seharga *6 dolar* per bulan, Anda bisa memiliki **VPN** server sendiri menggunakan **WireGuard VPN**. Ikuti caranya di artikel berikut ini untuk menginstall, dan mensetting VPS **Ubuntu 22.04** menjadi **VPN server** Anda.
|
||||
Cukup menggunakan VPS seharga _6 dolar_ per bulan, Anda bisa memiliki **VPN** server sendiri menggunakan **WireGuard VPN**. Ikuti caranya di artikel berikut ini untuk menginstall, dan mensetting VPS **Ubuntu 22.04** menjadi **VPN server** Anda.
|
||||
|
||||
<!--more-->
|
||||
---
|
||||
## <!--more-->
|
||||
|
||||
Setelah [beberapa seri artikel tentang **VPN IPsec**](https://insights.ditatompel.com/en/series/ipsec-vpn/) (dalam bahasa Inggris), hari ini saya ingin berbagi bagaimana cara mensetting [**WireGuard VPN**](https://www.wireguard.com/) sebagai server VPN. Jika dibandingkan dengan [L2TP/xAuth](https://insights.ditatompel.com/en/tutorials/ipsec-l2tp-xauth-ikev2-vpn-server-auto-setup/) dan [IKEv2 VPN](https://insights.ditatompel.com/en/tutorials/set-up-ikev2-vpn-server-and-clients/) (artikel saya sebelumnya tentang **IPsec VPN** dalam bahasa Inggris), dari sisi performa, **WireGuard VPN jauh lebih unggul** karena menggunakan **UDP** dan bukan **TCP**.
|
||||
|
||||
|
@ -49,70 +49,81 @@ Setelah [beberapa seri artikel tentang **VPN IPsec**](https://insights.ditatompe
|
|||
Jika Anda memiliki kesulitan teknis untuk melakukan setup VPN server WireGuard sendiri, {{< bs/alert-link "saya dapat membantu Anda untuk melakukannya" "https://www.fiverr.com/s/4vzPGR" >}} dengan imbalan sedikit uang.
|
||||
{{< /bs/alert >}}
|
||||
|
||||
|
||||
## Prasyarat
|
||||
|
||||
- Sebuah **VPS** dengan alamat IP publik.
|
||||
- Nyaman dan terbiasa dengan Linux *command-line*.
|
||||
- Nyaman dan terbiasa dengan Linux _command-line_.
|
||||
- Pengetahuan dasar _subnetting_ di **IPv4** (_jujur saja, sayya tidak begitu familiar dengan subnetting di IPv6, jadi artikel ini hanya untuk IPv4_).
|
||||
|
||||
Untuk pemilihan *cloud provider* mana yang akan Anda gunakan, itu terserah Anda. Di artikel ini, saya akan mengguakan **Droplet** di [**DigitalOcean**](https://m.do.co/c/42d4ba96cc94) (*referral link*) untuk VPN server saya. (Anda bisa mendapatkan kredit sebesar 200 dolar yang valid untuk 60 hari secara cuma-cuma dengan menggunakan *link* referensi saya).
|
||||
Untuk pemilihan _cloud provider_ mana yang akan Anda gunakan, itu terserah Anda. Di artikel ini, saya akan mengguakan **Droplet** di [**DigitalOcean**](https://m.do.co/c/42d4ba96cc94) (_referral link_) untuk VPN server saya. (Anda bisa mendapatkan kredit sebesar 200 dolar yang valid untuk 60 hari secara cuma-cuma dengan menggunakan _link_ referensi saya).
|
||||
|
||||
> _**CATATAN**: Anda harus tahu bahwa **cloud provider biasanya membebankan biaya *extra* jika Anda melebihi batasan quota** yang telah mereka berikan._
|
||||
|
||||
> _VPS server yang saya gunakan untuk artikel ini akan saya hapus ketika artikel ini dipublikasikan._
|
||||
|
||||
## Memesan dan Menjalankan VPS Baru (DigitalOcean Droplet, opsional)
|
||||
|
||||
> _Jika Anda sudah memiliki VPS, Anda bisa lompati langkah pada sesi ini dah langsung menuju langkah berikutnya: "[Setup WireGuard Server](#setup-wireguard-server)._
|
||||
|
||||
1. Masuk ke *project* Anda dan buat **Droplet** baru dengan memilih **Create new Droplet**.
|
||||
2. Untuk menghindari *latency* yang tinggi, **pilihlah region yang paling dekat dengan lokasi Anda**. Jika Anda di Indonesia, maka saat ini region terdekat di DigitalOcean adalah Singapore. Namun untuk tutorial kali ini saya ingin mencoba menggunakan Droplet yang lokasinya berada di Frankfurt.
|
||||
1. Masuk ke _project_ Anda dan buat **Droplet** baru dengan memilih **Create new Droplet**.
|
||||
2. Untuk menghindari _latency_ yang tinggi, **pilihlah region yang paling dekat dengan lokasi Anda**. Jika Anda di Indonesia, maka saat ini region terdekat di DigitalOcean adalah Singapore. Namun untuk tutorial kali ini saya ingin mencoba menggunakan Droplet yang lokasinya berada di Frankfurt.
|
||||
3. Pilih sistem operasi untuk Droplet Anda, saya akan menggunakan **Ubuntu** `22.04 LTS`.
|
||||
4. Pilih paket (**Droplet size**). Saya akan mulai dari yang rendah saja, **1 CPU** dengan **1GB of RAM** dan **bandwidth 1TB per bulan** ($6/bulan).
|
||||
Sesuaikan paket / *Droplet Size* yang sesuai dengan kebutuhan Anda untuk menghindari kemungkinan terkena biaya ekstra atas pemakaian bandwidth yang melebihi kapasitas paket (1TB per bulan cukup untuk saya).
|
||||
5. Pilih metode autentikasi Anda untuk mengakses VPS, Saya lebih memilih menggunakan **SSH _public_ dan _private key_** daripada menggunakan authentikasi menggunakan *password*.
|
||||
6. Untuk opsi sisanya, biarkan *default* apa adanya. _Saya yakin **Anda tidak memerlukan opsi backup dan managed database** untuk VPN server ini._
|
||||
4. Pilih paket (**Droplet size**). Saya akan mulai dari yang rendah saja, **1 CPU** dengan **1GB of RAM** dan **bandwidth 1TB per bulan** ($6/bulan).
|
||||
Sesuaikan paket / _Droplet Size_ yang sesuai dengan kebutuhan Anda untuk menghindari kemungkinan terkena biaya ekstra atas pemakaian bandwidth yang melebihi kapasitas paket (1TB per bulan cukup untuk saya).
|
||||
5. Pilih metode autentikasi Anda untuk mengakses VPS, Saya lebih memilih menggunakan **SSH _public_ dan _private key_** daripada menggunakan authentikasi menggunakan _password_.
|
||||
6. Untuk opsi sisanya, biarkan _default_ apa adanya. _Saya yakin **Anda tidak memerlukan opsi backup dan managed database** untuk VPN server ini._
|
||||
|
||||
> _**WireGuard** tidak membutuhkan **disk I/O** yang tinggi, jadi **VPS NVMe** tidak begitu penting (**SSD** sudah sangat cukup)._
|
||||
|
||||
## Setup WireGuard Server
|
||||
|
||||
> _**CATATAN PENTING**: Karena saya tidak begitu familiar dengan subnetting di **IPv6**, saya hanya akan menggunakan **IPv4** saja._
|
||||
|
||||
Setelah VPS kamu sudah siap dan sudah berjalan, saya sarankan untuk melakukan update OS terlebih dahulu menggunakan perintah `apt update && apt upgrade`, kemudian *restart* (`reboot`) VPS anda.
|
||||
Setelah VPS kamu sudah siap dan sudah berjalan, saya sarankan untuk melakukan update OS terlebih dahulu menggunakan perintah `apt update && apt upgrade`, kemudian _restart_ (`reboot`) VPS anda.
|
||||
|
||||
> _Jika Anda ingin bisa mengatur **WireGuard** peers (client) di server Anda dengan mudah, Anda mungkin tertarik untuk membaca "[Cara install WireGuard-UI untuk mengatur server VPN WireGuard dengan mudah]({{< ref "/tutorials/installing-wireguard-ui-to-manage-your-wireguard-vpn-server/index.id.md" >}})"._
|
||||
|
||||
### Install WireGuard
|
||||
Install WireGuard dengan menggunakan perintah `sudo apt install wireguard`. Setelah WireGuard berhasil diinstall, kita perlu membuat *private* dan *public key* untuk WireGuard server kita.
|
||||
|
||||
Install WireGuard dengan menggunakan perintah `sudo apt install wireguard`. Setelah WireGuard berhasil diinstall, kita perlu membuat _private_ dan _public key_ untuk WireGuard server kita.
|
||||
|
||||
> _Tips: Anda bisa membuat public key yang cantik (**vanity address**) untuk **WireGuard** menggunakan alat seperti [warner/wireguard-vanity-address](https://github.com/warner/wireguard-vanity-address)._
|
||||
|
||||
#### Membuat *Private Key*
|
||||
Anda bisa menggunakan perintah `wg genkey` untuk membuat *private key* Anda. Simpan *private key* Anda di tempat yang aman. Misalnya: di `/etc/wireguard/do_private.key` dengan *file permission* `600`.
|
||||
#### Membuat _Private Key_
|
||||
|
||||
Anda bisa menggunakan perintah `wg genkey` untuk membuat _private key_ Anda. Simpan _private key_ Anda di tempat yang aman. Misalnya: di `/etc/wireguard/do_private.key` dengan _file permission_ `600`.
|
||||
|
||||
```shell
|
||||
# membuat private key
|
||||
wg genkey | sudo tee /etc/wireguard/do_private.key
|
||||
# mengubah file permission
|
||||
sudo chmod 600 /etc/wireguard/do_private.key
|
||||
```
|
||||
*Private key* tersebut nantinya kita butuhkan untuk membuat *public key* untuk server WireGuard kita. Contoh WireGuard *private key* yang digunakan untuk artikel ini:
|
||||
|
||||
_Private key_ tersebut nantinya kita butuhkan untuk membuat _public key_ untuk server WireGuard kita. Contoh WireGuard _private key_ yang digunakan untuk artikel ini:
|
||||
|
||||
```
|
||||
uO0GDXBc+ZH5QsLmf+qRyCtFmUV1coadJvQp8iM0mEg=
|
||||
```
|
||||
|
||||
#### Membuat *Public Key*
|
||||
Sekarang, buat *public key* dari *private key* yang telah kita buat sebelumnya.
|
||||
#### Membuat _Public Key_
|
||||
|
||||
Sekarang, buat _public key_ dari _private key_ yang telah kita buat sebelumnya.
|
||||
|
||||
```shell
|
||||
sudo cat /etc/wireguard/do_private.key | wg pubkey | sudo tee /etc/wireguard/do_public.key
|
||||
```
|
||||
|
||||
*Public key* tersebut akan kita butuhkan untuk mengkonfigurasi koneksi WireGuard *client* (*peers*) kita. Contoh WireGuard *public key* yang digunakan untuk artikel ini:
|
||||
_Public key_ tersebut akan kita butuhkan untuk mengkonfigurasi koneksi WireGuard _client_ (_peers_) kita. Contoh WireGuard _public key_ yang digunakan untuk artikel ini:
|
||||
|
||||
```
|
||||
7c023YtKepRPNNKfGsP5f2H2VtfPvVptn8Hn6jjmaz8=
|
||||
```
|
||||
|
||||
### Mengkonfigurasi WireGuard Server
|
||||
Sebelum mengkonfigurasi server WireGuard Anda, Anda perlu memilih / menentukan *private network IP range* untuk koneksi WireGuard yang akan Anda gunakan. Anda harus menggunakan [private network IP ranges](https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses) yang **valid**. Contoh:
|
||||
|
||||
Sebelum mengkonfigurasi server WireGuard Anda, Anda perlu memilih / menentukan _private network IP range_ untuk koneksi WireGuard yang akan Anda gunakan. Anda harus menggunakan [private network IP ranges](https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses) yang **valid**. Contoh:
|
||||
|
||||
- Antara `10.0.0.0` - `10.255.255.255` (`10.0.0.0/8`)
|
||||
- Antara `172.16.0.0` - `172.31.255.255` (`172.16.0.0/12`)
|
||||
- Antara `192.168.0.0` - `192.168.255.255` (`192.168.0.0/16`)
|
||||
|
@ -121,9 +132,10 @@ Sebelum mengkonfigurasi server WireGuard Anda, Anda perlu memilih / menentukan *
|
|||
|
||||
Di artikel ini, saya akan menggunakan `10.10.88.0/24` untuk jaringan WireGuard saya.
|
||||
|
||||
Anda juga perlu menentukan *port* berapa (**UDP**) yang akan digunakan oleh WireGuard. Banyak perangkat jaringan di luar sana (seperti **Netgate**, **QNAP**, dan lain-lain) menggunakan **UDP** *port* **51280** untuk konfigurai WireGuard *default* mereka. Untuk artikel ini, saya akan menggunakan `UDP` port `51822`.
|
||||
Anda juga perlu menentukan _port_ berapa (**UDP**) yang akan digunakan oleh WireGuard. Banyak perangkat jaringan di luar sana (seperti **Netgate**, **QNAP**, dan lain-lain) menggunakan **UDP** _port_ **51280** untuk konfigurai WireGuard _default_ mereka. Untuk artikel ini, saya akan menggunakan `UDP` port `51822`.
|
||||
|
||||
Sekarang, kita sudah memiliki semua informasi dasar yang kita butuhkan supaya server WireGuard dapat dijalankan:
|
||||
|
||||
- Server Public IP: `xxx.xx.xx0.246`
|
||||
- Server Private key: `uO0GDXBc+ZH5QsLmf+qRyCtFmUV1coadJvQp8iM0mEg=`
|
||||
- Server Public Key: `7c023YtKepRPNNKfGsP5f2H2VtfPvVptn8Hn6jjmaz8=`
|
||||
|
@ -131,6 +143,7 @@ Sekarang, kita sudah memiliki semua informasi dasar yang kita butuhkan supaya se
|
|||
- WireGuard Network: `10.10.88.0/24`
|
||||
|
||||
Buat file dengan nama `wg0.conf` untuk konfigurasi WireGuard anda di folder `/etc/wireguard` dan isi dengan contoh konfigurasi berikut ini:
|
||||
|
||||
```plain
|
||||
# /etc/wireguard/wg0.conf
|
||||
|
||||
|
@ -140,43 +153,53 @@ Address = <YOUR_SERVER_WG_IP_ADDRESS> # Pada contoh artikel ini: 10.10.88.1/24
|
|||
ListenPort = <SERVER_UDP_LISTEN_PORT> # Pada contoh artikel ini: 51822
|
||||
SaveConfig = true
|
||||
```
|
||||
|
||||
> _**Catatan**: Dari konfigurasi diatas, perhatikan bahwa saya mengambil IP `10.10.88.1` untuk alamat IP server saya (di jaringan WireGuard)._
|
||||
|
||||
Ubah `<YOUR_SERVER_PRIVATE_KEY>`, `<YOUR_SERVER_IP_ADDRESS>`, `<SERVER_UDP_LISTEN_PORT>` dengan konfigurasi sesuai keinginan Anda.
|
||||
|
||||
#### Mengijinkan *IP forwarding*
|
||||
Di artikel ini, kita ingin memperbolehkan *peers* (*client* / perangkat yang terkoneksi ke jaringan WireGuard kita) untuk menggunakan WireGuard server sebagai *default gateway* mereka. Jadi semua lalu-lintas jaringan keluar (kecuali ke jaringan lokal **LAN/WLAN** Anda) dapat menggunakan server WireGuard ini. Jika Anda menggunakan WireGuard untuk *peer-to-peer* saja, Anda tidak memerlukan langkah ini.
|
||||
#### Mengijinkan _IP forwarding_
|
||||
|
||||
Di artikel ini, kita ingin memperbolehkan _peers_ (_client_ / perangkat yang terkoneksi ke jaringan WireGuard kita) untuk menggunakan WireGuard server sebagai _default gateway_ mereka. Jadi semua lalu-lintas jaringan keluar (kecuali ke jaringan lokal **LAN/WLAN** Anda) dapat menggunakan server WireGuard ini. Jika Anda menggunakan WireGuard untuk _peer-to-peer_ saja, Anda tidak memerlukan langkah ini.
|
||||
|
||||
Edit `/etc/sysctl.conf` dan di akhir file tersebut, tambahkan `net.ipv4.ip_forward=1`. Setelah itu jalankan perintah `sudo sysctl -p` untuk memuat ulang konfigurasi baru di `/etc/sysctl.conf` yang baru saja kita ubah.
|
||||
|
||||
```shell
|
||||
sudo sysctl -p
|
||||
```
|
||||
|
||||
Setelah itu, Anda perlu mengatur ulang konfigurasi *firewall* supaya *peers* (client) dapat melakukan koneksi ke server WireGuard dan lalu-lintas jaringan client ter-*routing* dengan benar.
|
||||
Setelah itu, Anda perlu mengatur ulang konfigurasi _firewall_ supaya _peers_ (client) dapat melakukan koneksi ke server WireGuard dan lalu-lintas jaringan client ter-_routing_ dengan benar.
|
||||
|
||||
#### Mengkonfigurasi Firewall
|
||||
Secara *default*, aplikasi **UFW** (program untuk memudahkan konfigurasi *firewall*) sudah terinstall di Ubuntu. Anda perlu menambahkan *port* yang digunakan oleh WireGuard supaya port tersebut terbuka dapat diakses dari mana saja.
|
||||
|
||||
Secara _default_, aplikasi **UFW** (program untuk memudahkan konfigurasi _firewall_) sudah terinstall di Ubuntu. Anda perlu menambahkan _port_ yang digunakan oleh WireGuard supaya port tersebut terbuka dapat diakses dari mana saja.
|
||||
|
||||
```shell
|
||||
sudo ufw allow OpenSSH
|
||||
sudo ufw allow proto udp to any port 51822
|
||||
```
|
||||
|
||||
Jika WireGuard port yang Anda konfigurasi bukan `51822`, ubah dan sesuaikan perintah diatas.
|
||||
|
||||
> _Perhatikan bahwa saya juga menambahkan **OpenSSH** ke *allow list* untuk menghindari terputusnya koneksi SSH ke server jika sebelumnya Anda belum mengkonfigurasi / mengaktifkan *firewall*._
|
||||
|
||||
Aktifkan / restart `ufw` dengan perintah:
|
||||
|
||||
```shell
|
||||
ufw enable # untuk mengaktifkan firewall, atau
|
||||
ufw reload # untuk merestart firewall
|
||||
```
|
||||
|
||||
Selanjutnya, Anda perlu mengetahui *interface* mana yang digunakan oleh server Anda sebagai *default route*-nya. untuk mengetahuinya, Anda bisa menggunakan perintah `ip route list default`. Contoh hasil dari perintah `ip route list default` saya:
|
||||
Selanjutnya, Anda perlu mengetahui _interface_ mana yang digunakan oleh server Anda sebagai _default route_-nya. untuk mengetahuinya, Anda bisa menggunakan perintah `ip route list default`. Contoh hasil dari perintah `ip route list default` saya:
|
||||
|
||||
```plain
|
||||
default via 164.90.160.1 dev eth0 proto static
|
||||
```
|
||||
Perhatikan kata setelah `dev`, itu adalah *default network interface*-nya. Dari contoh diatas, *default network interface* server saya adalah `eth0`.
|
||||
|
||||
Perhatikan kata setelah `dev`, itu adalah _default network interface_-nya. Dari contoh diatas, _default network interface_ server saya adalah `eth0`.
|
||||
|
||||
Sekarang, tambahkan konfigurasi berikut ke `/etc/wireguard/wg0.conf` pada bagian `[Interface]`:
|
||||
|
||||
```plain
|
||||
PostUp = ufw route allow in on wg0 out on eth0
|
||||
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
|
||||
|
@ -184,9 +207,10 @@ PreDown = ufw route delete allow in on wg0 out on eth0
|
|||
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
|
||||
```
|
||||
|
||||
Ubah `eth0` dari konfigurasi di atas dan sesuaikan dengan *default network interface* server Anda.
|
||||
Ubah `eth0` dari konfigurasi di atas dan sesuaikan dengan _default network interface_ server Anda.
|
||||
|
||||
Konfigurasi `/etc/wireguard/wg0.conf` Anda seharusnya mirip seperti berikut:
|
||||
|
||||
```plain
|
||||
# /etc/wireguard/wg0.conf
|
||||
|
||||
|
@ -202,13 +226,16 @@ PreDown = ufw route delete allow in on wg0 out on eth0
|
|||
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
|
||||
```
|
||||
|
||||
Sekarang, server WireGuard kita sudah siap, cobalah untuk menjalankan *service* WireGuard menggunakan `wg-quick` (via `systemd`):
|
||||
Sekarang, server WireGuard kita sudah siap, cobalah untuk menjalankan _service_ WireGuard menggunakan `wg-quick` (via `systemd`):
|
||||
|
||||
```shell
|
||||
sudo systemctl start wg-quick@wg0.service
|
||||
```
|
||||
Perhatikan bahwa `wg0` diatas diambil dari nama konfigurasi file pada folder `/etc/wireguard` (tapi tanpa *file extension* `.conf`). Jika nama konfigurasi WireGuard-nya adalah `internal.conf`, Anda dapat menjalankan konfigurasi WireGuard tersebut menggunakan perintah `systemctl start wg-quick@internal.service`.
|
||||
|
||||
Setelah perinta diatas, pastikan *service* WireGuard berjalan dengan perintah `systemctl status wg-quick@wg0.service`:
|
||||
Perhatikan bahwa `wg0` diatas diambil dari nama konfigurasi file pada folder `/etc/wireguard` (tapi tanpa _file extension_ `.conf`). Jika nama konfigurasi WireGuard-nya adalah `internal.conf`, Anda dapat menjalankan konfigurasi WireGuard tersebut menggunakan perintah `systemctl start wg-quick@internal.service`.
|
||||
|
||||
Setelah perinta diatas, pastikan _service_ WireGuard berjalan dengan perintah `systemctl status wg-quick@wg0.service`:
|
||||
|
||||
```plain
|
||||
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
|
||||
Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
|
||||
|
@ -239,45 +266,57 @@ Jun 05 14:52:31 fra1-do1 systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
|
|||
|
||||
> *Anda bisa menjalankan perintah `sudo systemctl enable wg-quick@wg0.service` agar service WireGuard berjalan otomatis setelah server dinyalakan atau *reboot*.*
|
||||
|
||||
## Konfigurasi WireGuard Peer (*client*)
|
||||
## Konfigurasi WireGuard Peer (_client_)
|
||||
|
||||
Pada sesi ini, saya akan menggunakan Linux (`wg-quick` via ``systemd`) sebagai contoh melakukan koneksi ke server WireGuard yang sudah kita konfigurasi sebelumnya. Untuk metode lain (seperti menggunakan **NetworkManager**), sistem operasi lain, atau koneksi dari ponsel, saya akan menambahkannya di lain artikel.
|
||||
|
||||
Mengkonfigurasi WireGuard *peer (client)* di Linux menggunakan `wg-quick` via `systemd` hampir sama seperti mengkonfigurasi server WireGuard. Perbedaannya adalah: Anda tidak memerlukan konfigurasi *IP forwarding* maupun *firewall* (kecuali Anda memiliki kebutuhan tertentu di mesin Linux Anda). Yang perlu Anda lakukan hanyalah menginstall WireGuard, membuat *private* dan *public key*, dan menentukan **DNS** server mana yang ingin Anda gunakan.
|
||||
Mengkonfigurasi WireGuard _peer (client)_ di Linux menggunakan `wg-quick` via `systemd` hampir sama seperti mengkonfigurasi server WireGuard. Perbedaannya adalah: Anda tidak memerlukan konfigurasi _IP forwarding_ maupun _firewall_ (kecuali Anda memiliki kebutuhan tertentu di mesin Linux Anda). Yang perlu Anda lakukan hanyalah menginstall WireGuard, membuat _private_ dan _public key_, dan menentukan **DNS** server mana yang ingin Anda gunakan.
|
||||
|
||||
### Membuat *Private* and *Public Key* (*Client Side*)
|
||||
Jika Anda sudah mempunyai pasangan *public & private key* untuk WireGuard sebelumnya, Anda bisa menggunakan *public & private key* tersebut dan langsung ke sesi berikutnya: "[Mengkonfigurasi WireGuard Peer (client)](#mengkonfigurasi-wireguard-peer-client)".
|
||||
### Membuat _Private_ and _Public Key_ (_Client Side_)
|
||||
|
||||
Jika Anda sudah mempunyai pasangan _public & private key_ untuk WireGuard sebelumnya, Anda bisa menggunakan _public & private key_ tersebut dan langsung ke sesi berikutnya: "[Mengkonfigurasi WireGuard Peer (client)](#mengkonfigurasi-wireguard-peer-client)".
|
||||
|
||||
> _Tips: Anda bisa membuat public key yang cantik (**vanity address**) untuk **WireGuard** menggunakan alat seperti [warner/wireguard-vanity-address](https://github.com/warner/wireguard-vanity-address)._
|
||||
|
||||
#### Membuat Peer Private key
|
||||
Anda bisa menggunakan perintah `wg genkey` untuk membuat *private key* Anda. Simpan *private key* Anda di tempat yang aman. Misalnya: di `/etc/wireguard/do_private.key` dengan *file permission* `600`.
|
||||
|
||||
Anda bisa menggunakan perintah `wg genkey` untuk membuat _private key_ Anda. Simpan _private key_ Anda di tempat yang aman. Misalnya: di `/etc/wireguard/do_private.key` dengan _file permission_ `600`.
|
||||
|
||||
```shell
|
||||
# membuat private key
|
||||
wg genkey | sudo tee /etc/wireguard/do_private.key
|
||||
# mengubah file permission
|
||||
sudo chmod 600 /etc/wireguard/do_private.key
|
||||
```
|
||||
*Private key* tersebut nantinya kita butuhkan untuk membuat *public key* untuk server WireGuard kita. Contoh WireGuard *private key* yang digunakan untuk artikel ini:
|
||||
|
||||
_Private key_ tersebut nantinya kita butuhkan untuk membuat _public key_ untuk server WireGuard kita. Contoh WireGuard _private key_ yang digunakan untuk artikel ini:
|
||||
|
||||
```
|
||||
WApLrVqFvXMbvsn+62DxfQCY8rsFqmHCEFAabAeA5WY=
|
||||
```
|
||||
|
||||
Change `/etc/wireguard/do_private.key` file permission with `sudo chmod 600 /etc/wireguard/do_private.key`.
|
||||
|
||||
#### Generate Peer Public Key
|
||||
Sekarang, buat *public key* dari *private key* yang telah kita buat sebelumnya.
|
||||
|
||||
Sekarang, buat _public key_ dari _private key_ yang telah kita buat sebelumnya.
|
||||
|
||||
```shell
|
||||
sudo cat /etc/wireguard/do_private.key | wg pubkey | sudo tee /etc/wireguard/do_public.key
|
||||
```
|
||||
|
||||
*Public key* tersebut akan kita butuhkan untuk ditambahkan ke konfigurasi server WireGuard kita. Contoh WireGuard *public key* yang digunakan untuk artikel ini:
|
||||
_Public key_ tersebut akan kita butuhkan untuk ditambahkan ke konfigurasi server WireGuard kita. Contoh WireGuard _public key_ yang digunakan untuk artikel ini:
|
||||
|
||||
```
|
||||
6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk=
|
||||
```
|
||||
|
||||
### Mengkonfigurasi WireGuard Peer (client)
|
||||
Sebelum mengkonfigurasi WireGuard *peer* (*client*), Anda perlu memilih / menentukan *alamat IP private* untuk koneksi WireGuard peer yang akan Anda gunakan. Anda harus menggunakan alamat IP yang tidak terpakai dari *private network IP range* WireGuard server Anda. Di artikel ini, `10.10.88.1/24` sudah digunakan oleh server WireGuard, dan kita tidak bisa menggunakan alamat IP tersebut untuk *peer* / *client* kita. Maka dari itu, saya akan menggunakan `10.10.88.2/24` (atau `10.10.88.2/32`).
|
||||
|
||||
Sekarang, kita sudah memiliki semua informasi dasar yang kita butuhkan supaya untuk konfigurasi WireGuard *peer*:
|
||||
Sebelum mengkonfigurasi WireGuard _peer_ (_client_), Anda perlu memilih / menentukan _alamat IP private_ untuk koneksi WireGuard peer yang akan Anda gunakan. Anda harus menggunakan alamat IP yang tidak terpakai dari _private network IP range_ WireGuard server Anda. Di artikel ini, `10.10.88.1/24` sudah digunakan oleh server WireGuard, dan kita tidak bisa menggunakan alamat IP tersebut untuk _peer_ / _client_ kita. Maka dari itu, saya akan menggunakan `10.10.88.2/24` (atau `10.10.88.2/32`).
|
||||
|
||||
Sekarang, kita sudah memiliki semua informasi dasar yang kita butuhkan supaya untuk konfigurasi WireGuard _peer_:
|
||||
|
||||
- Server Public IP: `xxx.xx.xx0.246`
|
||||
- Server Public Key: `7c023YtKepRPNNKfGsP5f2H2VtfPvVptn8Hn6jjmaz8=`
|
||||
- Server Listen Port: `UDP` port `51822`
|
||||
|
@ -285,6 +324,7 @@ Sekarang, kita sudah memiliki semua informasi dasar yang kita butuhkan supaya un
|
|||
- Client IP address: `10.10.88.2/24`
|
||||
|
||||
Buat file dengan nama `wg-do1.conf` untuk konfigurasi WireGuard Anda di folder `/etc/wireguard` dan isi dengan contoh konfigurasi berikut ini:
|
||||
|
||||
```plain
|
||||
# /etc/wireguard/wg-do1.conf
|
||||
|
||||
|
@ -303,60 +343,71 @@ PersistentKeepalive = 15
|
|||
Ubah `<YOUR_PEER_PRIVATE_KEY>`, `<YOUR_PEER_IP_ADDRESS>`, `<YOUR_SERVER_PUBLIC_KEY>`, `<YOUR_SERVER_PUBLIC_IP_ADDRESS>`, dan `<SERVER_UDP_LISTEN_PORT>` dan sesuaikan dengan milik Anda.
|
||||
|
||||
Catatan:
|
||||
- `AllowedIPs` = `0.0.0.0/0` artinya semua lalu-lintas jaringan akan melalui *peer* tersebut (dalam hal ini, server WireGuard kita).
|
||||
Anda bisa menentukan / memilih *routing* menuju IP/*network* tertentu supaya melewati *peer* tertentu (Jika Anda terkoneksi ke banyak *peer* / server).
|
||||
Sebagai contoh, jika Anda hanya ingin mengarahkan lalu-lintas jaringan menuju IP 1.0.0.1 dan 8.8.4.4 melalui *peer* tertentu dan menggunakan konesi internet dari ISP Anda sebagai *default route*-nya, Anda bisa menghapus `0.0.0.0/0` dan menambahkan `1.0.0.1/32,8.8.4.4/32` (dipisahkan dengan tanda koma) untuk nilai dari `AllowedIPs`.
|
||||
- `PersistentKeepalive` = `15` : Berapa detik sekali *peer* mengirimkan *ping* ke server, supaya server dapat mencapai / berkomunikasi dengan peer yang berada dibalik **NAT**/firewall.
|
||||
|
||||
- `AllowedIPs` = `0.0.0.0/0` artinya semua lalu-lintas jaringan akan melalui _peer_ tersebut (dalam hal ini, server WireGuard kita).
|
||||
Anda bisa menentukan / memilih _routing_ menuju IP/_network_ tertentu supaya melewati _peer_ tertentu (Jika Anda terkoneksi ke banyak _peer_ / server).
|
||||
Sebagai contoh, jika Anda hanya ingin mengarahkan lalu-lintas jaringan menuju IP 1.0.0.1 dan 8.8.4.4 melalui _peer_ tertentu dan menggunakan konesi internet dari ISP Anda sebagai _default route_-nya, Anda bisa menghapus `0.0.0.0/0` dan menambahkan `1.0.0.1/32,8.8.4.4/32` (dipisahkan dengan tanda koma) untuk nilai dari `AllowedIPs`.
|
||||
- `PersistentKeepalive` = `15` : Berapa detik sekali _peer_ mengirimkan _ping_ ke server, supaya server dapat mencapai / berkomunikasi dengan peer yang berada dibalik **NAT**/firewall.
|
||||
- `DNS` Anda juga dapat menentukan DNS server yang ingin Anda gunakan dengan menentukan alamat IP DNS server pada konfigurasi `DNS`.
|
||||
|
||||
#### Menambahkan *Peers Public Key* ke WireGuard Server
|
||||
#### Menambahkan _Peers Public Key_ ke WireGuard Server
|
||||
|
||||
Setelah itu, Anda perlu menambahkan setiap peer public key ke konfigurasi WireGuard server. Hal ini perlu dilakukan agar peers (client) dapat melakukan koneksi ke WireGuard server. Ada 2 cara yang bisa dilakukan, tergantung dari konfigurasi server Anda.
|
||||
|
||||
Jika Anda mengikuti tutorial ini dengan setting `SaveConfig = true` pada server, maka Anda bisa menambahkan *peer public key* dengan perintah berikut di WireGuard Server:
|
||||
Jika Anda mengikuti tutorial ini dengan setting `SaveConfig = true` pada server, maka Anda bisa menambahkan _peer public key_ dengan perintah berikut di WireGuard Server:
|
||||
|
||||
```shell
|
||||
wg set wg0 peer 6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk= allowed-ips 10.10.88.2
|
||||
```
|
||||
Ubah `wg0` sesuai dengan *interface* WireGuard Anda di server, `6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk=` dengan *public key peer* Anda, dan `10.10.88.2` dengan alamat IP pada *IP range* WireGuard yang akan digunakan oleh peer.
|
||||
|
||||
Jika Anda tidak menggunakan setting `SaveConfig = true` pada server, maka Anda tinggal menambahkan informasi *peer* ke konfigurasi server (`/etc/wireguard/wg0.conf`). Contohnya:
|
||||
Ubah `wg0` sesuai dengan _interface_ WireGuard Anda di server, `6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk=` dengan _public key peer_ Anda, dan `10.10.88.2` dengan alamat IP pada _IP range_ WireGuard yang akan digunakan oleh peer.
|
||||
|
||||
Jika Anda tidak menggunakan setting `SaveConfig = true` pada server, maka Anda tinggal menambahkan informasi _peer_ ke konfigurasi server (`/etc/wireguard/wg0.conf`). Contohnya:
|
||||
|
||||
```plain
|
||||
[Peer]
|
||||
PublicKey = 6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk=
|
||||
AllowedIPs = 10.10.88.2/32
|
||||
```
|
||||
Ubah `6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk=` dengan *public key peer* Anda, dan `10.10.88.2` dengan alamat IP pada *IP range* WireGuard yang akan digunakan oleh peer.
|
||||
|
||||
jangan lupa untuk melakukan *restart* WireGuard *service* setiap Anda melakukan perubahan pada file `/etc/wireguard/wg0.conf`.
|
||||
Ubah `6gnV+QU7jG7BzwWrBbqiYpKQDGePYQunebkmvmFrxSk=` dengan _public key peer_ Anda, dan `10.10.88.2` dengan alamat IP pada _IP range_ WireGuard yang akan digunakan oleh peer.
|
||||
|
||||
jangan lupa untuk melakukan _restart_ WireGuard _service_ setiap Anda melakukan perubahan pada file `/etc/wireguard/wg0.conf`.
|
||||
|
||||
```shell
|
||||
sudo systemctl restart wg-quick@wg0.service
|
||||
```
|
||||
|
||||
### Melakukan koneksi ke Server
|
||||
Sekarang, konfigurasi *peer* (*client*) sudah selesai, Anda dapat mencoba melakukan koneksi ke WireGuard server dengan `wg-quick` via `systemd`:
|
||||
|
||||
Sekarang, konfigurasi _peer_ (_client_) sudah selesai, Anda dapat mencoba melakukan koneksi ke WireGuard server dengan `wg-quick` via `systemd`:
|
||||
|
||||
```shell
|
||||
sudo systemctl start wg-quick@wg-do1.service
|
||||
```
|
||||
|
||||
> _**Note 1**: Perhatikan bahwa `wg-do1` diatas diambil dari nama konfigurasi file pada folder `/etc/wireguard` (tapi tanpa *file extension* `.conf`). Jika nama konfigurasi WireGuard-nya adalah `vpn-wireguard.conf`, Anda dapat menjalankan konfigurasi WireGuard tersebut menggunakan perintah `systemctl start wg-quick@vpn-wireguard.service`._
|
||||
|
||||
> _**Note 2**: Scara default `wg-quick` menggunakan `resolvconf` untuk menambahkan entri DNS baru. Hal ini akan menyebabkan masalah dengan "network managers" dan "DHCP clients" yang tidak menggunakan `resolvconf`, karena mereka akan menulis ulang (overwrite) file `/etc/resolv.conf` (yang akan menghapus record DNS yang sudah ditambahkan oleh `wg-quick`._
|
||||
> _**Note 2**: Scara default `wg-quick` menggunakan `resolvconf` untuk menambahkan entri DNS baru. Hal ini akan menyebabkan masalah dengan "network managers" dan "DHCP clients" yang tidak menggunakan `resolvconf`, karena mereka akan menulis ulang (overwrite) file `/etc/resolv.conf` (yang akan menghapus record DNS yang sudah ditambahkan oleh `wg-quick`._
|
||||
> _Solusinya adalah menggunakan "software networking" yang kompatible dengan `resolvconf`._
|
||||
|
||||
> _**Note 3**: Pengguna Linux yang menggunakan `systemd-resolved` harus memastikan bahwa `systemd-resolvconf` terinstall di sistem operasi yang digunakan._
|
||||
|
||||
Untuk memverifikasi bahwa konfigurasi sudah benar dan bekerja, coba melakukan pengecekan IP publik Anda dari *browser* atau terminal menggunakan `wg show` atau `curl ifconfig.me`.
|
||||
Untuk memverifikasi bahwa konfigurasi sudah benar dan bekerja, coba melakukan pengecekan IP publik Anda dari _browser_ atau terminal menggunakan `wg show` atau `curl ifconfig.me`.
|
||||
|
||||
![wg show](wg-show.png#center)
|
||||
|
||||
![What is my IP](wg-vpn-do-ip.png#center)
|
||||
|
||||
## Kesimpulan
|
||||
WireGuard adalah protokol VPN favorit saya. Performanya cepat dan lebih hemat *resource* jika dibandingkan dengan protokol VPN lainnya. Ia juga bisa digunakan untuk koneksi *peer-to-peer*, koneksi *client-server* atau membuat *mesh network* yang aman.
|
||||
|
||||
Ketika dikombinasikan dengan **Nginx** sebagai *reverse proxy*, Anda bahkan bisa mengekspose / server HTTP di jaringan lokal Anda yang berada dibalik **NAT**/*firewall* ke internet.
|
||||
WireGuard adalah protokol VPN favorit saya. Performanya cepat dan lebih hemat _resource_ jika dibandingkan dengan protokol VPN lainnya. Ia juga bisa digunakan untuk koneksi _peer-to-peer_, koneksi _client-server_ atau membuat _mesh network_ yang aman.
|
||||
|
||||
Akan tetapi, melakukan *maintenance* pada jaringan WireGuard yang besar bisa sangat kompleks dan susah dilakukan. Namun, ada *software* yang dapat membantu Anda untuk membantu mengatur hal itu, salah satu contohnya adalah [Netmaker](https://www.netmaker.io/).
|
||||
Ketika dikombinasikan dengan **Nginx** sebagai _reverse proxy_, Anda bahkan bisa mengekspose / server HTTP di jaringan lokal Anda yang berada dibalik **NAT**/_firewall_ ke internet.
|
||||
|
||||
Akan tetapi, melakukan _maintenance_ pada jaringan WireGuard yang besar bisa sangat kompleks dan susah dilakukan. Namun, ada _software_ yang dapat membantu Anda untuk membantu mengatur hal itu, salah satu contohnya adalah [Netmaker](https://www.netmaker.io/).
|
||||
|
||||
### Catatan Tambahan
|
||||
- Jika Anda memiliki kesulitan teknis untuk melakukan *setup* VPN server WireGuard sendiri, [saya dapat membantu Anda untuk melakukannya](https://www.fiverr.com/s/4vzPGR) dengan imbalan sedikit uang.
|
||||
|
||||
- Jika Anda memiliki kesulitan teknis untuk melakukan _setup_ VPN server WireGuard sendiri, [saya dapat membantu Anda untuk melakukannya](https://www.fiverr.com/s/4vzPGR) dengan imbalan sedikit uang.
|
||||
- Untuk dapat menghubungi saya, silahkan kunjungi [https://www.ditatompel.com/about](https://www.ditatompel.com/about).
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Instalasi PHP, Apache, MySQL dan PhpMyAdmin di Arch Linux"
|
||||
description: "Step-by-step instalasi PHP Apache, MySQL dan PhpMyAdmin di Arch Linux."
|
||||
summary: "Step-by-step instalasi PHP Apache, MySQL dan PhpMyAdmin di Arch Linux."
|
||||
# linkTitle:
|
||||
date: 2012-02-18T05:01:30+07:00
|
||||
lastmod:
|
||||
|
@ -34,40 +35,44 @@ authors:
|
|||
- ditatompel
|
||||
---
|
||||
|
||||
*Step-by-step* instalasi **PHP**, **Apache**, **MySQL** dan **PhpMyAdmin** di **Arch Linux**.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Kenapa Arch Linux? Karena saya nyaman menggunakan Arch, dan hanya dengan package managernya kita udah dapet kernel dan software-software terbaru dan *up-to-date*.
|
||||
Kenapa Arch Linux? Karena saya nyaman menggunakan Arch, dan hanya dengan package managernya kita udah dapet kernel dan software-software terbaru dan _up-to-date_.
|
||||
|
||||
{{< youtube zr7TVU7SZUs >}}
|
||||
|
||||
1. Pertama kita pastikan bahwa sistem kita sudah up to date.
|
||||
|
||||
```bash
|
||||
pacman -Syu
|
||||
```
|
||||
2. Jika sudah, kita mulai *install* apa yang kita butuhkan.
|
||||
|
||||
2. Jika sudah, kita mulai _install_ apa yang kita butuhkan.
|
||||
|
||||
```bash
|
||||
pacman -S php apache php-mcrypt phpmyadmin mysql
|
||||
```
|
||||
|
||||
3. masuk pada folder `/etc/webapps/phpmyadmin`, kemudian copy konfigurasi **phpmyadmin** ke `/etc/httpd/conf/extra`
|
||||
|
||||
```bash
|
||||
cp /etc/webapps/phpmyadmin/apache.example.conf /etc/httpd/conf/extra/httpd-phpmyadmin.conf
|
||||
```
|
||||
4. Kita *include-kan* konfigurasi tersebut pada `httpd.conf` utama di folder `/etc/httpd/conf`
|
||||
|
||||
4. Kita _include-kan_ konfigurasi tersebut pada `httpd.conf` utama di folder `/etc/httpd/conf`
|
||||
|
||||
```apache
|
||||
# Konfigurasi phpmyadmin
|
||||
Include conf/extra/httpd-phpmyadmin.conf
|
||||
```
|
||||
|
||||
![Apache Config PHPMyAdmin](phpmyadmin-include.png#center)
|
||||
|
||||
Kemudian cek `localhost` dan `phpmyadmin` pada browser.
|
||||
|
||||
6. Jika ada pesan *forbidden* pada **phpmyadmin**, kita tambahkan konfigurasi `DirectoryIndex index.html index.php` pada `/etc/httpd/conf/extra/httpd-phpmyadmin.conf` lalu **restart** http server.
|
||||
6. Jika ada pesan _forbidden_ pada **phpmyadmin**, kita tambahkan konfigurasi `DirectoryIndex index.html index.php` pada `/etc/httpd/conf/extra/httpd-phpmyadmin.conf` lalu **restart** http server.
|
||||
|
||||
![DirectoryIndex Apache](directoryIndex.png#center)
|
||||
|
||||
7. Jika **PhpMyAdmin** sudah dapat diakses, tetapi masih ada pesan error *"The mysqli extension is missing."* atau *"The mcrypt extension is missing"*; Kita perlu *me-enable* ekstensi tersebut pada `php.ini` dengan menghilangkan tanda titik koma (`;`) di depan ekstensi yang dibutuhkan.
|
||||
7. Jika **PhpMyAdmin** sudah dapat diakses, tetapi masih ada pesan error _"The mysqli extension is missing."_ atau _"The mcrypt extension is missing"_; Kita perlu _me-enable_ ekstensi tersebut pada `php.ini` dengan menghilangkan tanda titik koma (`;`) di depan ekstensi yang dibutuhkan.
|
||||
|
||||
![PHP Extension](extension.png#center)
|
||||
|
||||
|
@ -79,13 +84,12 @@ extension=mysql.so
|
|||
|
||||
kemudian kita coba **restart** http server lagi.
|
||||
|
||||
Untuk informasi, pada Arch Linux, secara default `httpd` berjalan dengan *user* `http` dan *group* `http`. Agar lebih nyaman dan tidak terdapat pesan error pada CMS2 tertentu, kita perlu merubah permission dan owner pada folder `/srv/http` (tempat folder `public_html`)
|
||||
Untuk informasi, pada Arch Linux, secara default `httpd` berjalan dengan _user_ `http` dan _group_ `http`. Agar lebih nyaman dan tidak terdapat pesan error pada CMS2 tertentu, kita perlu merubah permission dan owner pada folder `/srv/http` (tempat folder `public_html`)
|
||||
|
||||
```bash
|
||||
chown -R http:http /srv/http
|
||||
```
|
||||
|
||||
maka selesai sudah proses installasi Apache, PHP, MySQL, dan PhpMyAdmin.
|
||||
|
||||
Nah sementara basicnya sampe disini dulu.
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
title: "Installing PHP, Apache, MySQL, and phpMyAdmin on Arch Linux"
|
||||
description: "A step-by-step guide to installing PHP, Apache, MySQL, and phpMyAdmin on Arch Linux."
|
||||
summary: "A step-by-step guide to installing PHP, Apache, MySQL, and phpMyAdmin on Arch Linux."
|
||||
date: 2012-02-18T05:01:30+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- SysAdmin
|
||||
tags:
|
||||
- Linux
|
||||
- MySQL
|
||||
- Apache
|
||||
- PHP
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Why Arch Linux? Because I'm comfortable using Arch, and with its package manager, we can easily install the latest and most up-to-date kernel and software.
|
||||
|
||||
**Video (in Indonesian):**
|
||||
|
||||
{{< youtube zr7TVU7SZUs >}}
|
||||
|
||||
1. First, we ensure that our system is up to date by running:
|
||||
|
||||
```bash
|
||||
pacman -Syu
|
||||
```
|
||||
|
||||
2. Next, we install the necessary packages using:
|
||||
|
||||
```bash
|
||||
pacman -S php apache php-mcrypt phpmyadmin mysql
|
||||
```
|
||||
|
||||
3. We then navigate to the `/etc/webapps/phpmyadmin` directory and copy the `phpmyadmin` configuration file to `/etc/httpd/conf/extra`:
|
||||
|
||||
```bash
|
||||
cp /etc/webapps/phpmyadmin/apache.example.conf /etc/httpd/conf/extra/httpd-phpmyadmin.conf
|
||||
```
|
||||
|
||||
4. We include the configuration in the main `httpd.conf` file located in the `/etc/httpd/conf` directory by adding:
|
||||
|
||||
```apache
|
||||
# phpmyadmin configuration
|
||||
Include conf/extra/httpd-phpmyadmin.conf
|
||||
```
|
||||
|
||||
![Apache Config PHPMyAdmin](phpmyadmin-include.png#center)
|
||||
|
||||
Then, we can access `localhost` and `phpmyadmin` in the browser.
|
||||
|
||||
6. If there is a forbidden message in **phpmyadmin**, we need to add the `DirectoryIndex index.html index.php` configuration to `/etc/httpd/conf/extra/httpd-phpmyadmin.conf`, then restart the http server.
|
||||
|
||||
![DirectoryIndex Apache](directoryIndex.png#center)
|
||||
|
||||
7. If **PhpMyAdmin** can be accessed, but there is still an error message "The mysqli extension is missing." or "The mcrypt extension is missing"; We need to enable the extension in `php.ini` by removing the semicolon (`;`) from the required extension.
|
||||
|
||||
![PHP Extension](extension.png#center)
|
||||
|
||||
```ini
|
||||
extension=mcrypt.so
|
||||
extension=mysqli.so
|
||||
extension=mysql.so
|
||||
```
|
||||
|
||||
Then, we can restart the http server again.
|
||||
|
||||
FYI: On Arch Linux, by default `httpd` runs as user `http` and group `http`. To make it more comfortable and avoid error messages on certain CMS installations, we need to change the permissions and owner of the `/srv/http` folder (where the `public_html` folder is located) using:
|
||||
|
||||
```bash
|
||||
chown -R http:http /srv/http
|
||||
```
|
||||
|
||||
The installation process for Apache, PHP, MySQL, and PhpMyAdmin is now complete.
|
||||
|
||||
For now, this concludes the basics.
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Konfigurasi PHPMyAdmin Untuk Multi Database Server"
|
||||
description: Cara mengkonfigurasi aplikasi PHPMyAdmin sehingga dapat digunakan untuk memanage multi MySQL database server.
|
||||
summary: Cara mengkonfigurasi aplikasi PHPMyAdmin sehingga dapat digunakan untuk memanage multi MySQL database server.
|
||||
# linkTitle:
|
||||
date: 2012-08-15T17:49:16+07:00
|
||||
lastmod:
|
||||
|
@ -32,25 +33,28 @@ authors:
|
|||
- ditatompel
|
||||
---
|
||||
|
||||
Pada kesempatan kali ini saya ingin berbagi bagaimana caranya mengkonfigurasi aplikasi **PHPMyAdmin** sehingga dapat digunakan untuk memanage **multi MySQL database server** (secara *remote*).
|
||||
|
||||
<!--more-->
|
||||
Pada kesempatan kali ini saya ingin berbagi bagaimana caranya mengkonfigurasi aplikasi **PHPMyAdmin** sehingga dapat digunakan untuk memanage **multi MySQL database server** (secara _remote_).
|
||||
|
||||
Saat menulis tulisan ini, penulis menggunakan **PHPMyAdmin** Versi `3.5.2.1` dengan Web Server **Apache** yang berjalan di atas OS **Linux**. Sedangkan untuk remote **MySQL database server** menggunakan versi `5.x`. Sebelumnya penulis mengansumsikan bahwa Anda telah dapat menjalankan **PHPMyAdmin** pada komputer Anda.
|
||||
|
||||
## Remote MySQL Server
|
||||
|
||||
Pada remote MySQL server, buatlah user database baru yang nanti kita gunakan untuk mengakses server tersebut dari PC atau komputer pribadi kita.
|
||||
|
||||
Pertama, login ke MySQL kemudian buat user baru :
|
||||
|
||||
```sql
|
||||
CREATE USER 'nama_user'@'alamat_ip' IDENTIFIED BY 'katasandi';
|
||||
```
|
||||
Dimana:
|
||||
- `nama_user` adalah *username database* yang kita gunakan untuk login ke database server.
|
||||
- `alamat_ip` adalah alamat IP atau *hostname* tempat dimana PHPMyAdmin diinstall.
|
||||
- `katasandi` adalah *password* untuk login ke database server.
|
||||
|
||||
Setelah itu berikan *permission* yang dibutuhkan pada user tersebut dengan perintah **GRANT** :
|
||||
Dimana:
|
||||
|
||||
- `nama_user` adalah _username database_ yang kita gunakan untuk login ke database server.
|
||||
- `alamat_ip` adalah alamat IP atau _hostname_ tempat dimana PHPMyAdmin diinstall.
|
||||
- `katasandi` adalah _password_ untuk login ke database server.
|
||||
|
||||
Setelah itu berikan _permission_ yang dibutuhkan pada user tersebut dengan perintah **GRANT** :
|
||||
|
||||
```sql
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'nama_user'@'alamat_ip';
|
||||
```
|
||||
|
@ -58,21 +62,27 @@ GRANT ALL PRIVILEGES ON *.* TO 'nama_user'@'alamat_ip';
|
|||
![MySQL GRANT](phpmyadmin1.png#center)
|
||||
|
||||
**Dimana :**
|
||||
|
||||
- `ALL PRIVILEGES` artinya semua permission yang dimiliki user tersebut kecuali opsi `GRANT` ke user lain.
|
||||
- `*.*` Artinya semua database dan table. Tanda bintang pertama berdiri untuk nama database dan tanda bintang ke dua berdiri untuk table dalam database tersebut.
|
||||
- `'nama_user'@'alamat_ip'` adalah username yang sudah kita buat sebelumnya.
|
||||
|
||||
Misalnya Anda hanya menginginkan permission **SELECT**, dan **UPDATE** *table* `tbl_transaksi` di dalam database `db_website` untuk user `finance` dengan alamat IP `192.169.1.1` gunakan :
|
||||
Misalnya Anda hanya menginginkan permission **SELECT**, dan **UPDATE** _table_ `tbl_transaksi` di dalam database `db_website` untuk user `finance` dengan alamat IP `192.169.1.1` gunakan :
|
||||
|
||||
```sql
|
||||
GRANT SELECT, UPDATE ON db_website.tbl_transaksi TO 'finance'@'192.169.1.1';
|
||||
```
|
||||
Kemudian terakhir jangan lupa untuk **flush** untuk *privilege*-nya.
|
||||
|
||||
Kemudian terakhir jangan lupa untuk **flush** untuk _privilege_-nya.
|
||||
|
||||
```sql
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
## PHPMyAdmin Client
|
||||
|
||||
Cari dimana lokasi aplikasi **PHPMyAdmin** berada. Pada tutorial kali ini, lokasinya ada pada `/usr/share/webapps/phpmyadmin`. Edit file `config.inc.php` yang berada pada folder tersebut dan tambahkan konfigrasi berikut :
|
||||
|
||||
```php
|
||||
$i++;
|
||||
$cfg['Servers'][$i]['verbose'] = 'MRTG IP 169.1/28';
|
||||
|
@ -86,6 +96,7 @@ $cfg['Servers'][$i]['auth_type'] = 'cookie';
|
|||
![PHPMyAdmin `config.inc.php`](phpmyadmin2.png#center)
|
||||
|
||||
**Dimana :**
|
||||
|
||||
- `verbose` adalah nama server yang akan muncul di **PHPMyAdmin**
|
||||
- `host` adalah alamat IP atau nama domain remote MySQL database server.
|
||||
- `port` adalah port remote MySQL database server. (default `3306`)
|
||||
|
@ -107,4 +118,5 @@ Ataupun melakukan monitoring remote database dari komputer pribadi Anda meskipun
|
|||
|
||||
![MySQL Process PHPMyAdmin](phpmyadmin5.png)
|
||||
|
||||
Semoga berguna.
|
||||
Semoga berguna.
|
||||
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
---
|
||||
title: "PHPMyAdmin Configuration for Multi Database Server"
|
||||
description: How to configure the PHPMyAdmin application so that it can be used to manage multiple MySQL database servers.
|
||||
summary: How to configure the PHPMyAdmin application so that it can be used to manage multiple MySQL database servers.
|
||||
date: 2012-08-15T17:49:16+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- SysAdmin
|
||||
tags:
|
||||
- PHP
|
||||
- MySQL
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
On this occasion I would like to share how to configure the **PHPMyAdmin** application so that it can be used to manage **multiple MySQL database servers** (remotely).
|
||||
|
||||
When writing this article, the author used PHPMyAdmin Version `3.5.2.1` with Apache Web Server running on Linux OS. Meanwhile, the remote MySQL database server uses version `5.x`. Previously, the author assumed that you were able to run PHPMyAdmin on your computer.
|
||||
|
||||
## Remote MySQL Server
|
||||
|
||||
On the remote MySQL server, create a new database user that we will use to access the server from our PC or personal computer.
|
||||
|
||||
First, log in to MySQL and create a new user:
|
||||
|
||||
```sql
|
||||
CREATE USER 'user_name'@'ip_address' IDENTIFIED BY 'password';
|
||||
```
|
||||
|
||||
**Where**:
|
||||
|
||||
- `user_name` is the database username that we use to log in to the database server.
|
||||
- `ip_address` is the IP address or hostname where PHPMyAdmin is installed.
|
||||
- `password` is the password to log in to the database server.
|
||||
|
||||
After that, grant the required permissions to the user with the **GRANT** command:
|
||||
|
||||
```sql
|
||||
GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'ip_address';
|
||||
```
|
||||
|
||||
![MySQL GRANT](phpmyadmin1.png#center)
|
||||
|
||||
**Where**:
|
||||
|
||||
- `ALL PRIVILEGES` means all permissions that the user has, except for the **GRANT** option to other users.
|
||||
- `*.*` means all databases and tables. The first asterisk represents the database name, and the second asterisk represents the table in the database.
|
||||
- `'user_name'@'ip_address'` is the username that we created previously.
|
||||
|
||||
For example, if you only want **SELECT** permission, and **UPDATE** permissions for the `tbl_transaction` table in the `db_website` database for user `finance` with IP address `192.169.1.1`, use:
|
||||
|
||||
```sql
|
||||
GRANT SELECT, UPDATE ON db_website.tbl_transaction TO 'finance'@'192.169.1.1';
|
||||
```
|
||||
|
||||
Then, finally, don't forget to **FLUSH PRIVILEGES**.
|
||||
|
||||
```sql
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
## PHPMyAdmin Client
|
||||
|
||||
Find where the PHPMyAdmin application is located. In this tutorial, the location is `/usr/share/webapps/phpmyadmin`. Edit the config.inc.php file in that directory and add the following configuration:
|
||||
|
||||
```php
|
||||
$i++;
|
||||
$cfg['Servers'][$i]['verbose'] = 'MRTG IP 169.1/28';
|
||||
$cfg['Servers'][$i]['host'] = '192.168.1.5';
|
||||
$cfg['Servers'][$i]['port'] = '3306';
|
||||
$cfg['Servers'][$i]['connect_type'] = 'tcp';
|
||||
$cfg['Servers'][$i]['extension'] = 'mysqli';
|
||||
$cfg['Servers'][$i]['auth_type'] = 'cookie';
|
||||
```
|
||||
|
||||
![PHPMyAdmin `config.inc.php`](phpmyadmin2.png#center)
|
||||
|
||||
**Where :**
|
||||
|
||||
- `verbose` is the server name that will appear in PHPMyAdmin.
|
||||
- `host` is the IP address or domain name of the remote MySQL database server.
|
||||
- `port` is the port number of the remote MySQL database server (default `3306`).
|
||||
- `connect_type` is the connection type used. There are two options: `socket` and `tcp`. We use `tcp` because the MySQL server is not on the same server as the PHPMyAdmin server that is currently running.
|
||||
- `extension` is the PHP MySQL extension used for the above connection.
|
||||
- `auth_type` is the authentication mode used for login.
|
||||
|
||||
After that, try opening the PHPMyAdmin page in a web browser. Then additional options will appear on the login page, as follows:
|
||||
|
||||
![PMA Login Page](phpmyadmin3.png#center)
|
||||
|
||||
Then, simply log in with your username and password according to the server choice.
|
||||
|
||||
With this feature, you can perform or utilize synchronization from a remote server to a local server or vice versa:
|
||||
|
||||
![PHPMyAdmin View](phpmyadmin4.png#center)
|
||||
|
||||
Or monitor remote databases from your personal computer, even though PHPMyAdmin is not installed on the remote MySQL server.
|
||||
|
||||
![MySQL Process PHPMyAdmin](phpmyadmin5.png)
|
||||
|
||||
Hope it's useful.
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Membaca Binary Secara Manual"
|
||||
description: "Bagaimana membaca sekumpulan angka 0 dan 1 (Binary) menjadi decimal. Kemudian cara menggunakan angka desimal tersebut diterjemahkan ke text (ASCII) menggunakan ASII table"
|
||||
summary: "Bagaimana membaca sekumpulan angka 0 dan 1 (Binary) menjadi decimal. Kemudian cara menggunakan angka desimal tersebut diterjemahkan ke text (ASCII) menggunakan ASII table"
|
||||
# linkTitle:
|
||||
date: 2012-01-08T04:29:52+07:00
|
||||
lastmod:
|
||||
|
@ -32,13 +33,9 @@ authors:
|
|||
- jasmerah1966
|
||||
---
|
||||
|
||||
Bagaimana membaca sekumpulan angka 0 dan 1 (*Binary*/*Biner*) menjadi angka *decimal*/*Desimal*. Kemudian cara menggunakan angka desimal tersebut diterjemahkan ke text (ASCII) menggunakan **ASII table** atau keyboard & Notepad.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Tulisan ini diadopsi dari tulisan om **ditatompel** dari **devilzc0de** yang berjudul Membaca [Binary Secara Manual](https://rtd.ditatompel.com/membaca-binary-secara-manual/) dan diadaptasi seperlunya. Semoga berguna terutama buat kamu yang ingin mulai masuk di bidang ilmu komputer.
|
||||
|
||||
Sebenarnya artikel ini udah lama. Beberapa saya pungut dari tulisannya om **Capsoel** di **X-Code Magazine edisi 6**, om **ditatompel** dari **devilzc0de** dan sisanya *Googling*. Semoga berguna terutama buat kamu yang ingin mulai masuk di bidang ilmu komputer.
|
||||
Sebenarnya artikel ini udah lama. Beberapa saya pungut dari tulisannya om **Capsoel** di **X-Code Magazine edisi 6**, om **ditatompel** dari **devilzc0de** dan sisanya _Googling_. Semoga berguna terutama buat kamu yang ingin mulai masuk di bidang ilmu komputer.
|
||||
|
||||
## Apa itu bilangan Binary?
|
||||
|
||||
|
@ -46,12 +43,14 @@ Sebenarnya artikel ini udah lama. Beberapa saya pungut dari tulisannya om **Caps
|
|||
01000100011001010111011001101001011011000111101001100011001100000110010001100101
|
||||
```
|
||||
|
||||
Apa itu? kenapa hanya angka `0` dan `1`? Saya yakin tidak semua orang (bahkan yang setiap harinya utak atik komputer) mengerti bagimana membaca **Binary**. Bahkan orang-orang yang *"ahli"* berkecimpung di bidang trading Binomo seperti **Indra Kenz** atau **Doni Salmanan** yang baru viral belakangan ini mengerti cara menerjemahkan *binary* ke *decimal*, karena memang tidak ada hubungannya dengan *trading* mereka :laughing:.
|
||||
Apa itu? kenapa hanya angka `0` dan `1`? Saya yakin tidak semua orang (bahkan yang setiap harinya utak atik komputer) mengerti bagimana membaca **Binary**. Bahkan orang-orang yang _"ahli"_ berkecimpung di bidang trading Binomo seperti **Indra Kenz** atau **Doni Salmanan** yang baru viral belakangan ini mengerti cara menerjemahkan _binary_ ke _decimal_, karena memang tidak ada hubungannya dengan _trading_ mereka :laughing:.
|
||||
|
||||
Sederetan angka 0 dan 1 ini adalah kode **binary**. Pertama, saya akan menunjukan bagaimana membaca sekumpulan angka 0 dan 1 tersebut sebagai angka **desimal**. Kemudian saya baru menunjukan bagaimana cara menggunakan angka tersebut diterjemahkan ke text (ASCII) menggunakan **ASCII table**.
|
||||
|
||||
## Menerjemahkan Binary ke Decimal
|
||||
|
||||
Sebagai contoh mudah:
|
||||
|
||||
```
|
||||
10101
|
||||
```
|
||||
|
@ -63,12 +62,13 @@ _ _ _ _ _
|
|||
```
|
||||
|
||||
Cara membaca **binary** adalah dari kanan ke kiri.
|
||||
* Slot **pertama** dari kanan mewakili nilai **1**,
|
||||
* slot **kedua** dari kanan mewakili nilai **2**,
|
||||
* slot **ketiga** mewakili nilai **4**,
|
||||
* slot **keempat** mewakili nilai **8**,
|
||||
* slot **kelima** mewakili **16**,
|
||||
* dan seterusnya hingga slot ke 8.
|
||||
|
||||
- Slot **pertama** dari kanan mewakili nilai **1**,
|
||||
- slot **kedua** dari kanan mewakili nilai **2**,
|
||||
- slot **ketiga** mewakili nilai **4**,
|
||||
- slot **keempat** mewakili nilai **8**,
|
||||
- slot **kelima** mewakili **16**,
|
||||
- dan seterusnya hingga slot ke 8.
|
||||
|
||||
```
|
||||
slot 1 = 1
|
||||
|
@ -82,9 +82,10 @@ slot 8 = 128
|
|||
```
|
||||
|
||||
Dengan memberikan angka `1` atau `0` pada slot-slot tersebut, kita menentukan nilai pada slot tersebut. 1 bernilai "`true`", dan 0 bernilai "`false`". Sebagai contoh:
|
||||
* nilai bilangan **desimal** `1` dalam **binary** adalah `1`,
|
||||
* nilai bilangan **desimal** `2` dalam **binary** adalah `10`,
|
||||
* nilai bilangan **desimal** `4` dalam **binary** adalah `100`.
|
||||
|
||||
- nilai bilangan **desimal** `1` dalam **binary** adalah `1`,
|
||||
- nilai bilangan **desimal** `2` dalam **binary** adalah `10`,
|
||||
- nilai bilangan **desimal** `4` dalam **binary** adalah `100`.
|
||||
|
||||
Kenapa bisa begitu? Kembali lagi ke slot-slot di atas.
|
||||
|
||||
|
@ -96,7 +97,7 @@ _ _ _ _ 1
|
|||
|
||||
Untuk **desimal** `2`, bilangan **biner** = `10`
|
||||
|
||||
karena slot pertama bernilai 1 diberi angka 0 (*false*) dan slot ke 2 diberi angka 1 (*true*)
|
||||
karena slot pertama bernilai 1 diberi angka 0 (_false_) dan slot ke 2 diberi angka 1 (_true_)
|
||||
|
||||
```
|
||||
_ _ _ 1 0
|
||||
|
@ -104,30 +105,32 @@ _ _ _ 1 0
|
|||
|
||||
Untuk **desimal** `4`, bilangan **biner** = `100`
|
||||
|
||||
karena slot pertama bernilai 1 diberi angka 0 (*false*) dan slot ke 2 diberi angka 0 (*false*) dan baru slot ketiga yg bernilai 4 diberi angka 1 (*true*)
|
||||
karena slot pertama bernilai 1 diberi angka 0 (_false_) dan slot ke 2 diberi angka 0 (_false_) dan baru slot ketiga yg bernilai 4 diberi angka 1 (_true_)
|
||||
|
||||
```
|
||||
_ _ 1 0 0
|
||||
```
|
||||
|
||||
Lalu gimana klo **desimal** `3`? Kan ga ada nilainya pada slot? `1 + 2 = 3`. Jadi, nilai **desimal** `3` pada **binary** adalah `11`
|
||||
|
||||
```
|
||||
_ _ _ 1 1
|
||||
```
|
||||
|
||||
klo desimal `5`? `1 + 4 = 5` berarti bilangan *binernya* `101`.
|
||||
klo desimal `5`? `1 + 4 = 5` berarti bilangan _binernya_ `101`.
|
||||
|
||||
```
|
||||
_ _ 1 0 1
|
||||
```
|
||||
|
||||
Lalu jika kode binernya panjang banget seperti ini? Gimana bacanya ke **ASCII** / *text*?
|
||||
Lalu jika kode binernya panjang banget seperti ini? Gimana bacanya ke **ASCII** / _text_?
|
||||
|
||||
```
|
||||
01000100011001010111011001101001011011000111101001100011001100000110010001100101
|
||||
```
|
||||
|
||||
Pisahkan dulu menjadi 8 digit:
|
||||
|
||||
```
|
||||
01000100 01100101 01110110 01101001 01101100 01111010 01100011 00110000 01100100 01100101
|
||||
```
|
||||
|
@ -148,13 +151,14 @@ Lalu convert ke bilangan **decimal**
|
|||
```
|
||||
|
||||
## Menerjemahkan Decimal ke ASCII
|
||||
|
||||
Lalu ASCIInya mana? Untuk menerjemahkan Decimal ke ASCII, bisa menggunakan ASCII table berikut (gunakan kolom `Dec` dan `Char`):
|
||||
|
||||
![ASCII table](ascii-table.png#center "ASCII table")
|
||||
|
||||
Atau jika menggunakan Windows bisa coba gunakan Notepad pada Windows, caranya tahan <kbd>ALT + Bilangan decimal</kbd> yang sudah ditranslate. (terakhir saya coba di Notepad Windows XP, kurang tau sekarang masih bisa atau tidak). Misal :
|
||||
|
||||
<kbd>ALT</kbd> + <kbd>68</kbd> = `D`
|
||||
<kbd>ALT</kbd> + <kbd>68</kbd> = `D`
|
||||
<kbd>ALT</kbd> + <kbd>101</kbd> = `e`
|
||||
|
||||
dan seterusnya, silahkan dicoba dan dibuktikan.
|
||||
|
|
107
content/tutorials/membaca-binary-secara-manual/index.md
Normal file
107
content/tutorials/membaca-binary-secara-manual/index.md
Normal file
|
@ -0,0 +1,107 @@
|
|||
---
|
||||
title: "Reading Binaries Manually"
|
||||
description: "How to read a set of numbers 0 and 1 (Binary) into decimal. Then how to use the decimal number to translate it into text (ASCII) using an ASII table"
|
||||
summary: "How to read a set of numbers 0 and 1 (Binary) into decimal. Then how to use the decimal number to translate it into text (ASCII) using an ASII table"
|
||||
# linkTitle:
|
||||
date: 2012-01-08T04:29:52+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
categories:
|
||||
- TIL
|
||||
tags:
|
||||
- Binary
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
- jasmerah1966
|
||||
---
|
||||
|
||||
I'd like to share with you a tutorial on reading binary numbers manually, which can be useful for those interested in computer science. This article is based on information gathered from various sources, including **@Capsoel**'s work in **X-Code Magazine issue 6** and **@ditatompel** from **devilzc0de**.
|
||||
|
||||
## What are Binary Numbers?
|
||||
|
||||
Binary numbers are a fundamental number system used to represent data as a sequence of 0s and 1s. Each digit represents a **power of 2**, allowing for a very efficient representation of large amounts of information. Binary is widely used in computer science, engineering, and various scientific fields.
|
||||
|
||||
At first glance, the series of 0s and 1s below may seem puzzling:
|
||||
|
||||
```
|
||||
01000100011001010111011001101001011011000111101001100011001100000110010001100101
|
||||
```
|
||||
|
||||
However, this is actually a binary code. In this article, we will explore how to read these numbers and translate them into decimal and eventually text (ASCII) using the ASCII table.
|
||||
|
||||
## Translating Binary to Decimal
|
||||
|
||||
To illustrate the process, let's consider an example:
|
||||
|
||||
```
|
||||
10101
|
||||
```
|
||||
|
||||
Imagine five empty slots (`_ _ _ _ _`) that represent the binary code. To read the binary code, start from **right to left**. Each slot has a specific value:
|
||||
|
||||
- Slot 1: 1
|
||||
- Slot 2: 2
|
||||
- Slot 3: 4
|
||||
- Slot 4: 8
|
||||
- Slot 5: 16
|
||||
- and so on until the 8th slot.
|
||||
|
||||
Assigning a 0 or 1 to each slot determines the value of that slot.
|
||||
|
||||
For instance, if the first slot is 0 and the second slot is 1 (`_ _ _ 1 0`), the decimal number would be `2` because:
|
||||
|
||||
```plain
|
||||
0 * 1 = 0
|
||||
1 * 2 = 2
|
||||
========= +
|
||||
2
|
||||
```
|
||||
|
||||
Another example, if the first slot is 1, the second slot is 0, and the third slot is 1 (`_ _ 1 0 1`), the decimal number would be `5` because:
|
||||
|
||||
```plain
|
||||
1 * 1 = 1
|
||||
0 * 2 = 0
|
||||
1 * 4 = 4
|
||||
========= +
|
||||
5
|
||||
```
|
||||
|
||||
## Translating Binary to ASCII
|
||||
|
||||
Now let's consider a longer binary code:
|
||||
|
||||
```
|
||||
01000100011001010111011001101001011011000111101001100011001100000110010001100101
|
||||
```
|
||||
|
||||
To translate this into decimal and eventually text, split the binary code into eight-digit groups (octets):
|
||||
|
||||
```
|
||||
01000100 01100101 01110110 01101001 01101100 01111010 01100011 00110000 01100100 01100101
|
||||
```
|
||||
|
||||
Then convert each group to a decimal number:
|
||||
|
||||
- `01000100` = 68
|
||||
- `01100101` = 101
|
||||
- ...
|
||||
|
||||
## Translating Decimal to ASCII
|
||||
|
||||
To translate the decimal numbers into text, you can use an ASCII table or a Windows-based application like Notepad. The ASCII table is shown below:
|
||||
|
||||
![ASCII table](ascii-table.png#center "ASCII table")
|
||||
|
||||
Alternatively, on Windows, hold the `<ALT>` key and press the corresponding decimal number to display the ASCII character. For example:
|
||||
|
||||
- `68` = `D`
|
||||
- `101` = `e`
|
||||
|
||||
Try experimenting with different combinations to see how they translate!
|
||||
|
||||
I hope this revised article is helpful in understanding how to read binary numbers manually and translating them into text.
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "Membuat Lab Virtualisasi Pada Jaringan Lokal Dengan VirtualBox (2012)"
|
||||
description: "Beberapa teman bertanya dan tertarik untuk belajar build server. Kebanyakan dari mereka berfikir bahwa untuk belajar build server / maintenance server itu butuh VPS atau bahkan dedicated server. Sebenarnya kita bisa memanfaatkan VirtualBox untuk membangun lab virtualisasi lokal."
|
||||
description: "Memanfaatkan VirtualBox untuk membangun lab virtualisasi pada jaringan lokal."
|
||||
summary: "Memanfaatkan VirtualBox untuk membangun lab virtualisasi pada jaringan lokal."
|
||||
# linkTitle:
|
||||
date: 2012-12-21T20:40:14+07:00
|
||||
lastmod:
|
||||
|
@ -8,10 +9,6 @@ draft: false
|
|||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
# nav_icon:
|
||||
# vendor: bootstrap
|
||||
# name: toggles
|
||||
# color: '#e24d0e'
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
|
@ -21,36 +18,27 @@ tags:
|
|||
- Linux
|
||||
- MySQL
|
||||
images:
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Belakangan ada beberapa teman yang bertanya dan tertarik untuk belajar *build* server. Kebanyakan dari mereka berfikir bahwa untuk belajar build server / maintenance server itu butuh **VPS** atau bahkan *dedicated server*. Apa bener begitu? Padahal harga untuk **VPS** untuk ukuran sebagian mahasiswa dirasa cukup tinggi, apa lagi *dedicated server*.
|
||||
Belakangan ada beberapa teman yang bertanya dan tertarik untuk belajar _build_ server. Kebanyakan dari mereka berfikir bahwa untuk belajar build server / maintenance server itu butuh **VPS** atau bahkan _dedicated server_. Apa bener begitu? Padahal harga untuk **VPS** untuk ukuran sebagian mahasiswa dirasa cukup tinggi, apa lagi _dedicated server_.
|
||||
|
||||
<!--more-->
|
||||
Sebenarnya kalau kita hanya ingin belajar, tidak harus sewa **VPS**, awal2 kita bisa manfaatkan yang namanya _virtualisasi_. (namanya belajar jadi ga perlu kan _IP public_ yang bisa diakses siapa saja, makanya kita gunakan jaringan dan IP lokal).
|
||||
|
||||
Sebenarnya kalau kita hanya ingin belajar, tidak harus sewa **VPS**, awal2 kita bisa manfaatkan yang namanya *virtualisasi*. (namanya belajar jadi ga perlu kan *IP public* yang bisa diakses siapa saja, makanya kita gunakan jaringan dan IP lokal).
|
||||
Ada banyak jalan untuk melakukan virtualisasi ini, ada **OpenVZ**, **VirtualBox**, **Xen**, **VMware**, dll. dari **para-virtualisasi** sampai **full-virtualisasi**, dari versi _community_ (gratis) sampai _enterprise_ (berbayar). Masing-masing ada kelebihan dan kekurangan (dan saya ga mau berdebat masalah ini).
|
||||
|
||||
Ada banyak jalan untuk melakukan virtualisasi ini, ada **OpenVZ**, **VirtualBox**, **Xen**, **VMware**, dll. dari **para-virtualisasi** sampai **full-virtualisasi**, dari versi *community* (gratis) sampai *enterprise* (berbayar). Masing-masing ada kelebihan dan kekurangan (dan saya ga mau berdebat masalah ini).
|
||||
|
||||
kali ini saya menggunakan **VirtualBox**, Karena sudah banyak user yang menggunakan **VirtualBox** pada komputer pribadinya. Sebelum melanjutkan, saya informasikan dulu situasi dan kondisi pada saat *guide* ini dibuat.
|
||||
kali ini saya menggunakan **VirtualBox**, Karena sudah banyak user yang menggunakan **VirtualBox** pada komputer pribadinya. Sebelum melanjutkan, saya informasikan dulu situasi dan kondisi pada saat _guide_ ini dibuat.
|
||||
|
||||
- **Subnet**: `/24`
|
||||
- **Gateway** : `192.168.0.2`
|
||||
- **Host OS** : IP=`192.168.0.242` OS=`Linux`
|
||||
|
||||
Taruh kata saya ingin membuat **2 virtual server**, 1 untuk *database server* (**MySQL server**) dan 1 sever lainnya untuk apa juga belum terpikirkan. ;p
|
||||
Taruh kata saya ingin membuat **2 virtual server**, 1 untuk _database server_ (**MySQL server**) dan 1 sever lainnya untuk apa juga belum terpikirkan. ;p
|
||||
|
||||
Jadi yang dibutuhkan :
|
||||
- **VirtualBox** dengan *module* `vboxnetfit`
|
||||
|
||||
- **VirtualBox** dengan _module_ `vboxnetfit`
|
||||
- **ISO CentOS 6.x netinstall**
|
||||
- Koneksi Internet
|
||||
|
||||
|
@ -58,9 +46,11 @@ Video:
|
|||
{{< youtube r5s8lBDNBXI >}}
|
||||
|
||||
## Part 1: Setting Guest Hosts (virtual server)
|
||||
Pertama kita pastinya butuh **VirtualBox**. Silahkan yang belom punya download dulu. Kemudian module `vboxnetfit` untuk *bridged adapter* ke *virtual server*. Kemungkinan Anda juga butuh module `vboxdrv` (optional buat jalanin custom *kernel*) Aktifinnya tinggal `modprobe` [nama_module].
|
||||
|
||||
Pertama kita pastinya butuh **VirtualBox**. Silahkan yang belom punya download dulu. Kemudian module `vboxnetfit` untuk _bridged adapter_ ke _virtual server_. Kemungkinan Anda juga butuh module `vboxdrv` (optional buat jalanin custom _kernel_) Aktifinnya tinggal `modprobe` [nama_module].
|
||||
|
||||
Jika sudah mari kita jalankan VirtualBox dan buat virtual hostnya. Caranya klik Icon New di kiri atas, lalu masukan informasi nama dan OS yang digunakan. Misalnya:
|
||||
|
||||
- **Name** : CentOS Contoh Server III
|
||||
- **Type** : Linux
|
||||
- **Version** : RedHat (32/64 sesuai CPU Host)
|
||||
|
@ -69,7 +59,7 @@ Kemudian tekan tombol Next.
|
|||
|
||||
![Add New VirtualBox Host](feature-virtual-lab-jar-lokal-01.png#center)
|
||||
|
||||
berikutnya menentukan kapasitas **RAM** yang nantinya dipake sama *virtual server*, kasi aja **512MB**, klo udah tekan tombol next lagi.
|
||||
berikutnya menentukan kapasitas **RAM** yang nantinya dipake sama _virtual server_, kasi aja **512MB**, klo udah tekan tombol next lagi.
|
||||
|
||||
![VirtualBox Set Guest RAM](virtual-lab-jar-lokal-02.png#center)
|
||||
|
||||
|
@ -77,11 +67,11 @@ Selanjutnya buat virtual HDD, pilih opsi ke 2 **"Create a virtual hard drive now
|
|||
|
||||
![VirtualBox Set Guest Virtual HDD](virtual-lab-jar-lokal-03.png#center)
|
||||
|
||||
Setelah itu keluar lagi pilihan buat tipe hard drivenya. Klo nantinya tidak ingin memindah ke virtualisasi lain pilih saja *default* **VDI**. Tp kali ini saya pilih **QEMU** biar **dikira** *dewa*. Klo udah tekan tombol **Create**.
|
||||
Setelah itu keluar lagi pilihan buat tipe hard drivenya. Klo nantinya tidak ingin memindah ke virtualisasi lain pilih saja _default_ **VDI**. Tp kali ini saya pilih **QEMU** biar **dikira** _dewa_. Klo udah tekan tombol **Create**.
|
||||
|
||||
![VirtualBox Set Guest Virtual HDD Type](virtual-lab-jar-lokal-04.png#center)
|
||||
|
||||
nanti di sebelah kiri ada *list Virtual Guest* yang pernah dibuat. Klik kanan pada menu yang baru aja kita buat dan pilih **"Setting"**.
|
||||
nanti di sebelah kiri ada _list Virtual Guest_ yang pernah dibuat. Klik kanan pada menu yang baru aja kita buat dan pilih **"Setting"**.
|
||||
|
||||
Pada menu **Storage** => **Controller IDE** pilih image file yang digunakan. Ane pake **ISO CentOS 6.2 Netinstall 64 Bit**.
|
||||
|
||||
|
@ -95,11 +85,11 @@ klo udah klik **Ok**, lalu Start **Virtual Guest**nya.
|
|||
|
||||
Nah proses installasi sama aja ky install OS biasa.
|
||||
|
||||
Media Installation OS ane pilih URL *biar dikira admin*.
|
||||
Media Installation OS ane pilih URL _biar dikira admin_.
|
||||
|
||||
![Linux install method](virtual-lab-jar-lokal-07.png#center)
|
||||
|
||||
Yang perlu diperhatikan adalah : Gunakan Alamat *IP statik*/*DHCP Statik* dari *router*, jangan dinamis. Karena jika IP dinamis kita bakal susah ngeremote terutama masalah *fingerprint* SSH.
|
||||
Yang perlu diperhatikan adalah : Gunakan Alamat _IP statik_/_DHCP Statik_ dari _router_, jangan dinamis. Karena jika IP dinamis kita bakal susah ngeremote terutama masalah _fingerprint_ SSH.
|
||||
|
||||
![Linux install IP setting](virtual-lab-jar-lokal-08.png#center)
|
||||
|
||||
|
@ -127,7 +117,9 @@ Lalu jalankan perintah berikut untuk menjalankan virtual guest di background : `
|
|||
```bash
|
||||
VBoxManage startvm "CentOS Contoh Server III" --type=headless
|
||||
```
|
||||
|
||||
Kalau udah jalan coba `ping` ke IP virtual guest yang tadi kita buat (`192.168.0.152`), tunggu sampai up dan masuk melalui **SSH**.
|
||||
|
||||
```bash
|
||||
ssh root@192.168.0.152
|
||||
```
|
||||
|
@ -135,13 +127,17 @@ ssh root@192.168.0.152
|
|||
Dari sana nte bisa setting nama hostname, update software, dll.
|
||||
|
||||
## Part 2: Install Guest Host lain
|
||||
Ulangi **Part 1** untuk membuat *Virtual Guest* lain sehingga kita punya 2 *virtual host* dan di-*run* bersamaan dengan *option headless* tadi. Beri virtual guest ke 2 ini dengan IP `192.168.0.151`. Sebagai contoh virtual guest ke 2 kali ini kita gunakan untuk database server.
|
||||
|
||||
Ulangi **Part 1** untuk membuat _Virtual Guest_ lain sehingga kita punya 2 _virtual host_ dan di-_run_ bersamaan dengan _option headless_ tadi. Beri virtual guest ke 2 ini dengan IP `192.168.0.151`. Sebagai contoh virtual guest ke 2 kali ini kita gunakan untuk database server.
|
||||
|
||||
Di Virtual Guest yang ke-2 ini, install MySQL Server :
|
||||
|
||||
```bash
|
||||
yum install mysql mysql-devel mysql-server
|
||||
```
|
||||
|
||||
Start mysql server
|
||||
|
||||
```bash
|
||||
service mysqld start
|
||||
```
|
||||
|
@ -149,15 +145,19 @@ service mysqld start
|
|||
settting ulang mysql servernya dengan menjalankan perintah `/usr/bin/mysql_secure_installation`. Maka bakal ada pertanyaan interaktif untuk menyetting ulang MySQL server.
|
||||
|
||||
kemudian masuk ke MySQL server dengan user `root` untuk membuat user dan database baru.
|
||||
|
||||
```bash
|
||||
mysql -h localhost -u root -p
|
||||
```
|
||||
|
||||
maka nte bakal disuruh isi password mysqlnya untuk user root. Setelah masuk buat user baru:
|
||||
|
||||
```bash
|
||||
CREATE USER 'ditatompel'@'192.168.0.%' IDENTIFIED BY 'password';
|
||||
```
|
||||
|
||||
dimana:
|
||||
|
||||
- `ditatompel` adalah **nama user**nya
|
||||
- `192.168.0.%` adalah nama hostname/IP dari mana dia melakukan remote koneksi ke MySQL server. (`192.168.0.%` sama saja dengan `192.168.0.0/24`)
|
||||
- `password` adalah password yang digunakan.
|
||||
|
@ -165,6 +165,7 @@ dimana:
|
|||
```sql
|
||||
CREATE DATABASE IF NOT EXISTS db_testing;
|
||||
```
|
||||
|
||||
dimana `db_testing` adalah nama database yang nanti kita gunakan.
|
||||
|
||||
```sql
|
||||
|
@ -176,7 +177,8 @@ dimana `SELECT`, `INSERT`, `UPDATE`, `DELETE` adalah permission milik user `dita
|
|||
```sql
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
Kalau sudah pastikan juga port **MySQL** (*default* `3306`) tidak di block oleh *firewall*.
|
||||
|
||||
Kalau sudah pastikan juga port **MySQL** (_default_ `3306`) tidak di block oleh _firewall_.
|
||||
|
||||
![iptables](virtual-lab-jar-lokal-12.png#center)
|
||||
|
||||
|
@ -185,13 +187,13 @@ Setelah itu coba melakukan koneksi ke server MySQL dari virtual guest yang 1 nya
|
|||
```bash
|
||||
mysql -h 192.168.0.151 -u ditatompel -p
|
||||
```
|
||||
|
||||
dimana `192.168.0.151` adalah alamat IP server MySQL dan `ditatompel` adalah user yang kita buat pada server MySQL sebelumnya.
|
||||
|
||||
![iptables](virtual-lab-jar-lokal-13.png#center)
|
||||
|
||||
|
||||
> _**Q** : Om, klo mau bikin 5 virtual guest dan RAM laptop / PC ane cuma 1GB kan ga mungkin, trus gimana ?_
|
||||
|
||||
**A** : Nte pake / bawa pulang laptop temen, colokin ke 1 network dan jalanin virtualbox, lakuin langkah2 di atas. Klo nte ada 4 laptop dan per laptop nte jalanin 3 Virtual guest berarti nte punya 12 virtual guest.
|
||||
|
||||
Jadi intinya begitu semua sudah terhubung dan dapat berkomunikasi, beres udah. Nte bisa juga testing buat belajar *port knocking*, config *firewall*, **IDS/IPS**, *load balancing* sampai *clustering*. meskipun hasilnya masih sangat jauh dari maksimal.
|
||||
Jadi intinya begitu semua sudah terhubung dan dapat berkomunikasi, beres udah. Nte bisa juga testing buat belajar _port knocking_, config _firewall_, **IDS/IPS**, _load balancing_ sampai _clustering_. meskipun hasilnya masih sangat jauh dari maksimal.
|
||||
|
|
|
@ -0,0 +1,199 @@
|
|||
---
|
||||
title: "Creating a virtualization lab on a local network with VirtualBox (2012)"
|
||||
description: "This comprehensive guide leverages VirtualBox to build a virtualization lab on a local network, offering a flexible and cost-effective testing environment."
|
||||
summary: "This comprehensive guide leverages VirtualBox to build a virtualization lab on a local network, offering a flexible and cost-effective testing environment."
|
||||
# linkTitle:
|
||||
date: 2012-12-21T20:40:14+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- SysAdmin
|
||||
tags:
|
||||
- VirtualBox
|
||||
- Linux
|
||||
- MySQL
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Recently, several friends have asked and are interested in learning to build servers. Most of them think that to learn to build or maintain a server, you need a Virtual Private Server (VPS) or even a dedicated server. Is that true? Although the price for VPS for some students is considered quite high, let alone a dedicated server.
|
||||
|
||||
Actually, if we just want to learn, we don't have to rent a VPS; instead, we can use something called virtualization (It's called learning, so you don't need a public IP that can be accessed by anyone; that's why we use a local network).
|
||||
|
||||
There are many ways to do this virtualization: **OpenVZ**, **VirtualBox**, **Xen**, **VMware**, etc. - from _para-virtualization_ to _full-virtualization_, from community (free) to enterprise (paid) versions. Each has its advantages and disadvantages (although I don't want to debate this issue).
|
||||
|
||||
This time, I used VirtualBox because many users already use it on their personal computers. Before continuing, I will first inform you of the situation and conditions at the time this guide was created.
|
||||
|
||||
- Subnet: `/24`
|
||||
- Gateway: `192.168.0.2`
|
||||
- Host OS: IP=`192.168.0.242`, OS=`Linux`
|
||||
|
||||
I want to create two virtual servers - one for a database server (MySQL server) and another server for something I haven't thought of yet. ;p
|
||||
|
||||
So what's needed:
|
||||
|
||||
- VirtualBox with `vboxnetfit` module
|
||||
- ISO CentOS 6.x netinstall
|
||||
- Internet connection
|
||||
|
||||
Video:
|
||||
|
||||
{{< youtube r5s8lBDNBXI >}}
|
||||
|
||||
## Part 1: Setting Guest Hosts (virtual servers)
|
||||
|
||||
Firstly, we definitely need VirtualBox. Please download it if you don't have it already. Then, install the `vboxnetfit` module for bridged adapter to virtual server. You may also need the `vboxdrv` module (optional for running a custom kernel). Activate it by issuing `modprobe [module_name]` command.
|
||||
|
||||
Next, let's run VirtualBox and create a virtual host. To do this, click the New icon at the top left, then enter the name and OS information used. For example:
|
||||
|
||||
- **Name** : CentOS Server Example III
|
||||
- **Type** : Linux
|
||||
- **Version** : RedHat (32/64 according to Host CPU)
|
||||
|
||||
Then press the Next button.
|
||||
|
||||
![Add New VirtualBox Host](feature-virtual-lab-jar-lokal-01.png#center)
|
||||
|
||||
Next, determine the **RAM** capacity that will be used by the virtual server, just give it **512MB**, then press the next button again.
|
||||
|
||||
![VirtualBox Set Guest RAM](virtual-lab-jar-lokal-02.png#center)
|
||||
|
||||
Next, create a virtual HDD, select option 2 **"Create a virtual hard drive now"** then press next.
|
||||
|
||||
![VirtualBox Set Guest Virtual HDD](virtual-lab-jar-lokal-03.png#center)
|
||||
|
||||
After that, another option appears for the hard drive type. If you don't want to move to another virtualization later, just select default **VDI**. But this time I chose **QEMU**.
|
||||
|
||||
![VirtualBox Set Guest Virtual HDD Type](virtual-lab-jar-lokal-04.png#center)
|
||||
|
||||
Later on the left there will be a list of Virtual Guests that have been created. Right click on the menu we just created and select **"Settings"**.
|
||||
|
||||
In the **Storage** => **Controller IDE** menu, select the image file used. I'm using **ISO CentOS 6.2 Netinstall 64-bit**.
|
||||
|
||||
![VirtualBox Set Guest OS](virtual-lab-jar-lokal-05.png#center)
|
||||
|
||||
Then in the **Network** menu -> **Adapter 1**, change **Attached to** from **NAT** to **Bridged Adapter**. The name corresponds to the interface being used (in my case: `eth0`).
|
||||
|
||||
![VirtualBox Set Bridged Adapter](virtual-lab-jar-lokal-06.png#center)
|
||||
|
||||
Click **Ok**, then Start **Virtual Guest**.
|
||||
|
||||
So, the installation process is the same as installing a regular OS.
|
||||
|
||||
![Linux install method](virtual-lab-jar-lokal-07.png#center)
|
||||
|
||||
What you need to pay attention to is: Use a static IP/_Static DHCP_ address from the router, not dynamic. Because if our IP is dynamic it will be difficult to remote, especially the SSH fingerprint problem.
|
||||
|
||||
![Linux install IP setting](virtual-lab-jar-lokal-08.png#center)
|
||||
|
||||
This time I gave the IP `192.168.0.152`, Gateway `192.168.0.2` and use Google's DNS server (`8.8.8.8`).
|
||||
|
||||
Then fill in the **CentOS** image URL, I used `mirror.nus.edu.sg`, please change it via `kambing.ui.ac.id` / whatever that is. What is clear is that it suits the architecture you are using. For example (`http://kambing.ui.ac.id/centos/6.3/os/x86_64` for those using **64-bit**).
|
||||
|
||||
![Linux setup URL](virtual-lab-jar-lokal-09.png#center)
|
||||
|
||||
Then click ok and wait for the installation process finished; then you will be asked to _reboot_ the OS.
|
||||
|
||||
**Reboot**/**Poweroff** the virtual guest. We edit the **primary boot** from **CD-ROM** to **Hard Disk**. The method:
|
||||
|
||||
**Setting** -> **System** -> **Motherboard** -> **Boot Order** -> Raise the **Hard Disk** menu to the first position / uncheck **Floppy** and **CD/DVD-ROM**.
|
||||
|
||||
![VirtualBox Boot Order](virtual-lab-jar-lokal-10.png#center)
|
||||
|
||||
Try running Virtual Guest again. You can use **CLI** so that the virtual host can run in the background:
|
||||
|
||||
- display the Virtual Guest list with the command: `VBoxManage list vms`
|
||||
![VBoxManage list vms](virtual-lab-jar-lokal-11.png#center)
|
||||
- run the following command to run the virtual guest in the background: `VBoxManage startvm "virtual machine name" --type=headless`.
|
||||
|
||||
For example:
|
||||
|
||||
```bash
|
||||
VBoxManage startvm "CentOS Server Example III" --type=headless
|
||||
```
|
||||
|
||||
Once it's running, try `ping` the virtual guest IP that we created earlier (`192.168.0.152`), wait for it to come up and log in via **SSH**.
|
||||
|
||||
```bash
|
||||
ssh root@192.168.0.152
|
||||
```
|
||||
|
||||
From there you can set the hostname, update software, etc.
|
||||
|
||||
## Part 2: Install another Guest Host
|
||||
|
||||
Repeat **Part 1** to create another _Virtual Guest_ so that we have two _virtual hosts_, and run it simultaneously with the headless option. Give this second virtual guest the IP `192.168.0.151`. For example, this time, we will use the second virtual guest as a database server.
|
||||
|
||||
In this second virtual guest, install MySQL server:
|
||||
|
||||
```bash
|
||||
yum install mysql mysql-devel mysql-server
|
||||
```
|
||||
|
||||
Start MySQL server
|
||||
|
||||
```bash
|
||||
service mysqld start
|
||||
```
|
||||
|
||||
Setup the MySQL server by running the command `/usr/bin/mysql_secure_installation`. This will prompt an interactive sequence of questions to secure the MySQL server installation.
|
||||
|
||||
Then, log in to the MySQL server as the `root` user to create a new user and database.
|
||||
|
||||
```bash
|
||||
mysql -h localhost -u root -p
|
||||
```
|
||||
|
||||
You will be asked to enter the MySQL password for the `root` user. Once logged in, create a new user:
|
||||
|
||||
```bash
|
||||
CREATE USER 'ditatompel'@'192.168.0.%' IDENTIFIED BY 'password';
|
||||
```
|
||||
|
||||
Where:
|
||||
|
||||
- `ditatompel` is **username**
|
||||
- `192.168.0.%` represents the hostname/IP from which it makes remote connections to the MySQL server (note: this is equivalent to `192.168.0.0/24`)
|
||||
- `password` is the password used
|
||||
|
||||
```sql
|
||||
CREATE DATABASE IF NOT EXISTS db_testing;
|
||||
```
|
||||
|
||||
Where `db_testing` is the name of the database that we will use later.
|
||||
|
||||
```sql
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON db_testing.* TO 'ditatompel'@'192.168.0.%';
|
||||
```
|
||||
|
||||
Where `SELECT`, `INSERT`, `UPDATE`, and `DELETE` are user permissions granted from host `192.168.0.%` on all tables in the `db_testing` database (`db_testing`.\*). Don't forget to execute **FLUSH PRIVILEGES** afterwards.
|
||||
|
||||
```sql
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
Also ensure that the default **MySQL** port (3306) is not blocked by your _firewall_.
|
||||
|
||||
![iptables](virtual-lab-jar-lokal-12.png#center)
|
||||
|
||||
Afterward, try connecting to the MySQL server from the first virtual guest or from our PC using the following command:
|
||||
|
||||
```bash
|
||||
mysql -h 192.168.0.151 -u ditatompel -p
|
||||
```
|
||||
|
||||
Where `192.168.0.151` is the IP address of the MySQL server and `ditatompel` is the user that we created on the MySQL server previously.
|
||||
|
||||
![iptables](virtual-lab-jar-lokal-13.png#center)
|
||||
|
||||
> **Q**: If I want to create 5 virtual guests and my laptop/PC RAM is only 1GB, that's not possible, then what?
|
||||
|
||||
**A**: Then use/bring a friend's laptop home, plug it into the same network, and run VirtualBox on that machine. Do the steps above to set up the virtual environment. If you have multiple laptops and can dedicate one laptop per three virtual guests, you could potentially create 12 virtual guests.
|
||||
|
||||
So, once everything is connected and communicating, that's essentially it. You can also conduct testing to learn about port knocking, firewall configuration, intrusion detection systems (IDS)/intrusion prevention systems (**IPS**), load balancing, and clustering. However, the results will still be far from optimal.
|
|
@ -0,0 +1,150 @@
|
|||
---
|
||||
title: "Using GnuPG/PGP for Email Encryption in Thunderbird (2012)"
|
||||
url: "tutorials/using-gnupg-pgp-for-email-encryption-in-thunderbird-2012"
|
||||
description: "To safeguard sensitive email content, we can utilize GnuPG/PGP. GnuPG/PGP is employed to encrypt the body or message of an email."
|
||||
summary: "To safeguard sensitive email content, we can utilize GnuPG/PGP. GnuPG/PGP is employed to encrypt the body or message of an email."
|
||||
# linkTitle:
|
||||
date: 2012-07-29T19:47:55+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- Privasi
|
||||
- Security
|
||||
tags:
|
||||
- PGP
|
||||
- Thunderbird
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
In a previous article [About Email and Privacy]({{< ref "/blog/note-about-email-and-privacy/index.md" >}} "About Email and Privacy"), we discussed how email systems work, how emails are intercepted, analyzed header data, and briefly outlined ways to protect our email privacy. On this occasion, we wish to share with you how to use GnuPG for encrypting the content of an email.
|
||||
|
||||
When sharing information via email with friends or colleagues, it is not uncommon to include sensitive data such as email addresses, usernames, passwords,
|
||||
or other confidential information. To safeguard this sensitive content, we can utilize **GnuPG**. **GnuPG** is employed to encrypt the body or message of
|
||||
an email.
|
||||
|
||||
By employing this method, the exchange of information requires prior consent between the sender and recipient through the exchange of a **"public key"**,
|
||||
thereby ensuring that the message is much more secure in terms of confidentiality.
|
||||
|
||||
In this tutorial, we will utilize software **GnuPG** integrated with **Thunderbird**. The author prefers **Thunderbird** as a mail client because it is
|
||||
available on various operating systems. Additionally, **Thunderbird** provides several features/extensions, such as **Enigmail**, which enables us to
|
||||
perform encryption, decryption, and provide PGP signatures.
|
||||
|
||||
The following tools are required or used by the author for this guide:
|
||||
|
||||
- Linux Operating System
|
||||
- [GnuPG](https://www.gnupg.org/)
|
||||
- [Mozilla Thunderbird](https://www.thunderbird.net/)
|
||||
- [Enigmail](http://enigmail.mozdev.org/download/index.php.html)
|
||||
|
||||
Before proceeding, I assume that you have successfully installed **GnuPG**, **Thunderbird**, and the **Enigmail** plugin on your operating system.
|
||||
|
||||
## Creating a PGP Key with GnuPG
|
||||
|
||||
After downloading **GnuPG** and installing it, we can _generate_ a **PGP key** by running the command: `gpg --gen-key`. You will then have several _options_ for your generated _key_, including _key type_, _key size_, how long the key is _valid_, and _passphrase key_ for your PGP key.
|
||||
|
||||
```plain
|
||||
Please select what kind of key you want:
|
||||
(1) RSA and RSA (default)
|
||||
(2) DSA and Elgamal
|
||||
(3) DSA (sign only)
|
||||
(4) RSA (sign only)
|
||||
Your selection? 1
|
||||
```
|
||||
|
||||
First, we select option number 1 (`RSA and RSA`) which enables us to perform both _encryption_ and _signature_ of messages.
|
||||
|
||||
```plain
|
||||
RSA keys may be between 1024 and 4096 bits long.
|
||||
What keysize do you want? (2048) 2048
|
||||
Requested keysize is 2048 bits
|
||||
```
|
||||
|
||||
Next, we choose the desired **keysize**. By default, the program GPG uses a value of `2048`. Enter `2048` and press enter.
|
||||
|
||||
```plain
|
||||
Please specify how long the key should be valid.
|
||||
0 = key does not expire
|
||||
<n> = key expires in n days
|
||||
<n>w = key expires in n weeks
|
||||
<n>m = key expires in n months
|
||||
<n>y = key expires in n years
|
||||
Key is valid for? (0) 1y
|
||||
Key expires at Sun 27 Jul 2013 05:55:36 PM WIT
|
||||
Is this correct? (y/N) y
|
||||
```
|
||||
|
||||
Then, we determine how long the key is valid. In this example, I made the key valid for **1 year**. Enter `1y` and press enter.
|
||||
|
||||
```plain
|
||||
GnuPG needs to construct a user ID to identify your key.
|
||||
|
||||
Real name: Tutorial PGP
|
||||
Email address: test@crayoncreative.web.id
|
||||
Comment: Untuk contoh tutor PGP
|
||||
You selected this USER-ID:
|
||||
"Tutorial PGP (Untuk contoh tutor PGP) <test@crayoncreative.web.id>"
|
||||
|
||||
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
|
||||
You need a Passpharse to protect your secret key.
|
||||
```
|
||||
|
||||
The next step is to provide a **user ID** to identify the key we are creating. The user ID includes your original name, email address, and comment. Fill in all the forms and then type `O` and press enter.
|
||||
|
||||
After that, a _popup_ will appear with a form to fill in the **passphrase key**, as shown in the picture below:
|
||||
|
||||
![gpg gen-key](pgp-thunderbird-01.png#center)
|
||||
|
||||
Fill in the **passphrase key** which will serve as a password for using your PGP Key and decrypting messages. Press the `Ok` button, then wait for a few seconds, and you will see a _summary key_ with information such as expiration date, owner's name, and others. As shown on the picture, my **PGP public
|
||||
key** is `D47A605E`.
|
||||
|
||||
![gpg gen-key2](pgp-thunderbird-02.png#center)
|
||||
|
||||
## Using PGP in Thunderbird with Enigmail
|
||||
|
||||
Open your **Thunderbird** program, select option **OpenPGP** > **Key Management**. Then, a list of keys available on our system will appear, as shown in
|
||||
the picture below:
|
||||
|
||||
![OpenPGP management Thunderbird](pgp-thunderbird-03.png#center)
|
||||
|
||||
Make sure your **public key ID** on **OpenPGP** is the same as what you just created. Then, to perform testing, we can send an email to
|
||||
`adele-en@gnupp.de` (_PGP Email Robot_) with our _public key_ attached. The way to do it is by selecting menu **OpenPGP** > **Attach Public Key**.
|
||||
|
||||
![OpenPGP attach public key](pgp-thunderbird-04.png#center)
|
||||
|
||||
Then, a _popup list PGP key_ will appear. Select the PGP key according to the email we use (`D47A605E`) by checking the box on the left side of Account /
|
||||
User ID.
|
||||
|
||||
![List PGP keys](pgp-thunderbird-05.png#center)
|
||||
|
||||
Send your message, and then after a few seconds you will receive an email reply from **Adele**:
|
||||
|
||||
![List PGP keys](pgp-thunderbird-06.png#center)
|
||||
|
||||
Enter your **passphrase key PGP key** to find out the contents of the message. It should appear like the picture below:
|
||||
|
||||
![](pgp-thunderbird-07.png#center)
|
||||
|
||||
After successfully emailing with the _"Robot"_, it's time to try emailing with a real person. (_Find someone who is already familiar with using PGP and
|
||||
exchange Public Keys 1 same as each other_) In the **OpenPGP** menu, check the options **Sign Message** and **Encrypt Message**. (Make sure the pencil and
|
||||
key icons on the bottom right are yellow).
|
||||
|
||||
![Open PGP button Thunderbird](pgp-thunderbird-08.png#center)
|
||||
|
||||
Send the message, and then only someone who has a complete _PGP key_ and knows their _passphrase key_- can read the message.
|
||||
|
||||
![Open PGP button Thunderbird](pgp-thunderbird-09.png#center)
|
||||
|
||||
I hope this guide helps you who want to pay more attention to privacy when exchanging messages through email.
|
||||
|
||||
Refferences:
|
||||
|
||||
- [http://enigmail.mozdev.org/documentation/quickstart.php.html](http://enigmail.mozdev.org/documentation/quickstart.php.html)
|
||||
- [http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html](http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html)
|
||||
- [http://dart-ngo.gr/tutorials/747-gnupg-email-encryption-using-thunderbird-tutorial](http://dart-ngo.gr/tutorials/747-gnupg-email-encryption-using-thunderbird-tutorial)
|
|
@ -2,6 +2,7 @@
|
|||
title: "Pengunaan GnuPG/PGP Untuk Enkripsi Email Pada Thunderbird (2012)"
|
||||
url: "tutorials/pengunaan-gnupg-pgp-untuk-enkripsi-email-pada-thunderbird-2012"
|
||||
description: "Untuk melingdungi isi email yang sifatnya rahasia tersebut, maka kita dapat mengunakan fitur PGP. PGP digunakan untuk mengenkripsi body / isi pesan email."
|
||||
summary: "Untuk melingdungi isi email yang sifatnya rahasia tersebut, maka kita dapat mengunakan fitur PGP. PGP digunakan untuk mengenkripsi body / isi pesan email."
|
||||
# linkTitle:
|
||||
date: 2012-07-29T19:47:55+07:00
|
||||
lastmod:
|
||||
|
@ -9,10 +10,6 @@ draft: false
|
|||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
# nav_icon:
|
||||
# vendor: bootstrap
|
||||
# name: toggles
|
||||
# color: '#e24d0e'
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
|
@ -22,38 +19,30 @@ tags:
|
|||
- PGP
|
||||
- Thunderbird
|
||||
images:
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Pada artikel sebelumnya [Tentang Email dan Privasi]({{< ref "/blog/note-about-email-and-privacy/index.id.md" >}} "Tentang Email dan Privasi") kita telah membahas mengenai bagaimana sistem email bekerja, bagaimana pesan email dibajak, menganalisa header email, dan sedikit gambaran bagaimana melindungi privasi email kita. Pada kesempatan kali ini kita ingin sedikit berbagi bagaimana menggunakan GnuPG untuk mengenkripsi isi pesan email kita.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Ketika kita berbagi informasi melalui email dengan teman maupun rekan kerja, tidak jarang kita menyertakan data-data seperti email, username, password atau informasi sensitif lainnya. Untuk melingdungi isi email yang sifatnya rahasia tersebut, maka kita dapat mengunakan fitur **PGP**. **PGP** digunakan untuk mengenkripsi body / isi pesan email.
|
||||
|
||||
Dengan menggunakan metode ini maka proses pertukaran informasi membutuhkan persetujuan sebelumnya antara pihak pengirim dan pihak penerima dengan melakukan pertukaran **"public key"** sehingga isi pesan jauh lebih terjamin kerahasiaannya.
|
||||
|
||||
Dalam Tutorial ini kita akan menggunakan perangkat lunak **GnuPG** yang diintegrasikan dengan **mail client Thunderbird**. Author memlih **Thunderbird** sebagai mail client karena ia tersedia di berbagai macam OS. Selain itu **Thunderbird** menyediakan beberapa fitur / ekstensi, seperti **Enigmail** yang memungkinkan kita untuk melakukan *enkripsi*, *dekripsi*, dan memberikan *PGP signature*.
|
||||
Dalam Tutorial ini kita akan menggunakan perangkat lunak **GnuPG** yang diintegrasikan dengan **mail client Thunderbird**. Author memlih **Thunderbird** sebagai mail client karena ia tersedia di berbagai macam OS. Selain itu **Thunderbird** menyediakan beberapa fitur / ekstensi, seperti **Enigmail** yang memungkinkan kita untuk melakukan _enkripsi_, _dekripsi_, dan memberikan _PGP signature_.
|
||||
|
||||
Berikut adalah tools yang diperlukan / digunakan author untuk guide ini :
|
||||
|
||||
- OS Linux
|
||||
- [GnuPG](https://www.gnupg.org/)
|
||||
- [Mozilla Thunderbird](https://www.thunderbird.net/)
|
||||
- [Enigmail](http://enigmail.mozdev.org/download/index.php.html)
|
||||
|
||||
Sebelumnya, saya asumsikan bahwa Anda telah berhasil menginstall **GnuPG**, **Thunderbird**, dan *plugin* **Enigmail** pada sistem operasi Anda.
|
||||
Sebelumnya, saya asumsikan bahwa Anda telah berhasil menginstall **GnuPG**, **Thunderbird**, dan _plugin_ **Enigmail** pada sistem operasi Anda.
|
||||
|
||||
## Membuat PGP Key dengan GnuPG
|
||||
Setelah mendownload **GnuPG** dan menginstallnya, kita *generate* **PGP key** dengan menjalankan perintah : `gpg --gen-key`. Maka Anda memiliki beberapa *option* untuk *key* yang anda *generate*, dari *tipe key*, *keysize*, berapa lama key tersebut *valid* dan *passpharse key* untuk *PGP key* Anda.
|
||||
|
||||
Setelah mendownload **GnuPG** dan menginstallnya, kita _generate_ **PGP key** dengan menjalankan perintah : `gpg --gen-key`. Maka Anda memiliki beberapa _option_ untuk _key_ yang anda _generate_, dari _tipe key_, _keysize_, berapa lama key tersebut _valid_ dan _passpharse key_ untuk _PGP key_ Anda.
|
||||
|
||||
```plain
|
||||
Please select what kind of key you want:
|
||||
|
@ -63,13 +52,17 @@ Please select what kind of key you want:
|
|||
(4) RSA (sign only)
|
||||
Your selection? 1
|
||||
```
|
||||
Pada point pertama, kita pilih option nomor 1 (`RSA and RSA`) yang memungkinkan kita untuk melakukan *enkripsi* maupun *signing* pesan.
|
||||
|
||||
Pada point pertama, kita pilih option nomor 1 (`RSA and RSA`) yang memungkinkan kita untuk melakukan _enkripsi_ maupun _signing_ pesan.
|
||||
|
||||
```plain
|
||||
RSA keys may be between 1024 and 4096 bits long.
|
||||
What keysize do you want? (2048) 2048
|
||||
Requested keysize is 2048 bits
|
||||
```
|
||||
Kemudian kita akan memilih *keysize* yang diinginkan. Secara default, program GPG menggunakan value default `2048`. Ketikan `2048` kemudian tekan enter.
|
||||
|
||||
Kemudian kita akan memilih _keysize_ yang diinginkan. Secara default, program GPG menggunakan value default `2048`. Ketikan `2048` kemudian tekan enter.
|
||||
|
||||
```plain
|
||||
Please specify how long the key should be valid.
|
||||
0 = key does not expire
|
||||
|
@ -81,6 +74,7 @@ Key is valid for? (0) 1y
|
|||
Key expires at Sun 27 Jul 2013 05:55:36 PM WIT
|
||||
Is this correct? (y/N) y
|
||||
```
|
||||
|
||||
Selanjutnya kita menentukan **berapa lama key tersebut valid**. Pada contoh kali ini saya membuat key tersebut valid selama **1 tahun**. Ketikan `1y` kemudian tekan enter.
|
||||
|
||||
```plain
|
||||
|
@ -98,23 +92,24 @@ You need a Passpharse to protect your secret key.
|
|||
|
||||
Langkah selanjutnya adalah memberikan **user ID** untuk mengidentifikasi key yang sedang kita buat. User ID yang diberikan meliputi Nama Asli, Alamat Email, dan Komentar. Isi semua form tersebut kemudian ketik `O` dan tekan enter.
|
||||
|
||||
Setelah itu akan muncul *popup* berisi form untuk mengisi **passpharse key** seperti pada gambar di bawah ini :
|
||||
Setelah itu akan muncul _popup_ berisi form untuk mengisi **passpharse key** seperti pada gambar di bawah ini :
|
||||
|
||||
![gpg gen-key](pgp-thunderbird-01.png#center)
|
||||
|
||||
Isi **passpharse key** yang nantinya berfungsi sebagai password untuk menggunakan PGP Key dan mendekripsi pesan. Tekan tombol `Ok` kemudian tunggu beberapa saat dan kita akan melihat *summary key* dengan informasi yang ada, misalnya tanggal *expires*, nama pemilik, dan lain sebagainya. Seperti pada contoh di pada gambar, **PGP public key** saya adalah `D47A605E`.
|
||||
Isi **passpharse key** yang nantinya berfungsi sebagai password untuk menggunakan PGP Key dan mendekripsi pesan. Tekan tombol `Ok` kemudian tunggu beberapa saat dan kita akan melihat _summary key_ dengan informasi yang ada, misalnya tanggal _expires_, nama pemilik, dan lain sebagainya. Seperti pada contoh di pada gambar, **PGP public key** saya adalah `D47A605E`.
|
||||
|
||||
![gpg gen-key2](pgp-thunderbird-02.png#center)
|
||||
|
||||
## Penggunaan PGP pada Thunderbird dengan Enigmail
|
||||
Buka program **Thunderbird** Anda, pilih option **OpenPGP** > **Key Management**. Maka akan tampil *list key* yang ada pada sistem kita seperti pada gambar berikut :
|
||||
|
||||
Buka program **Thunderbird** Anda, pilih option **OpenPGP** > **Key Management**. Maka akan tampil _list key_ yang ada pada sistem kita seperti pada gambar berikut :
|
||||
![OpenPGP management Thunderbird](pgp-thunderbird-03.png#center)
|
||||
|
||||
Pastikan **public key ID** Anda pada **OpenPGP** sama dengan apa yang baru saja Anda buat. Kemudian untuk melakukan testing, kita dapat mengirimkan email ke `adele-en@gnupp.de` (*PGP Email Robot*) dengan menyertakan *public key* kita. Caranya, pilih menu **OpenPGP** > **Attach Public Key**.
|
||||
Pastikan **public key ID** Anda pada **OpenPGP** sama dengan apa yang baru saja Anda buat. Kemudian untuk melakukan testing, kita dapat mengirimkan email ke `adele-en@gnupp.de` (_PGP Email Robot_) dengan menyertakan _public key_ kita. Caranya, pilih menu **OpenPGP** > **Attach Public Key**.
|
||||
|
||||
![OpenPGP attach public key](pgp-thunderbird-04.png#center)
|
||||
|
||||
Setelah itu akan muncul *popup list PGP key* yang ada. Pilih PGP key sesuai dengan email yang kita gunakan (`D47A605E`) dengan memberikan tanda centang di sebelah kiri Account / User ID.
|
||||
Setelah itu akan muncul _popup list PGP key_ yang ada. Pilih PGP key sesuai dengan email yang kita gunakan (`D47A605E`) dengan memberikan tanda centang di sebelah kiri Account / User ID.
|
||||
|
||||
![List PGP keys](pgp-thunderbird-05.png#center)
|
||||
|
||||
|
@ -126,17 +121,18 @@ Masukan **passpharse key PGP key** Anda untuk mengetahui isi pesan tersebut. Kur
|
|||
|
||||
![](pgp-thunderbird-07.png#center)
|
||||
|
||||
Setelah berhasil beremail ria dengan sang *"Robot"*, maka saatnya mencoba untuk beremail ria dengan orang asli. (*Carilah orang yang sudah terbiasa menggunakan PGP dan saling bertukar Public Key 1 sama lain*) Pada menu **OpenPGP** centang option **Sign Message** dan **Encrypt Message**. (Pastikan tanda pensil dan kunci di sebelah kanan bawah berwarna kuning).
|
||||
Setelah berhasil beremail ria dengan sang _"Robot"_, maka saatnya mencoba untuk beremail ria dengan orang asli. (_Carilah orang yang sudah terbiasa menggunakan PGP dan saling bertukar Public Key 1 sama lain_) Pada menu **OpenPGP** centang option **Sign Message** dan **Encrypt Message**. (Pastikan tanda pensil dan kunci di sebelah kanan bawah berwarna kuning).
|
||||
|
||||
![Open PGP button Thunderbird](pgp-thunderbird-08.png#center)
|
||||
|
||||
Kirimkan pesan tersebut, maka **hanya orang yang memiliki *PGP key* lengkap dengan mengetahui *passpharse key*-nya yang dapat membaca pesan** tersebut.
|
||||
Kirimkan pesan tersebut, maka **hanya orang yang memiliki _PGP key_ lengkap dengan mengetahui _passpharse key_-nya yang dapat membaca pesan** tersebut.
|
||||
|
||||
![Open PGP button Thunderbird](pgp-thunderbird-09.png#center)
|
||||
|
||||
Semoga guide ini dapat membantu Anda yang ingin lebih memperhatikan privasi saat bertukar pesan melalui email.
|
||||
|
||||
Referensi:
|
||||
|
||||
- [http://enigmail.mozdev.org/documentation/quickstart.php.html](http://enigmail.mozdev.org/documentation/quickstart.php.html)
|
||||
- [http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html](http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html)
|
||||
- [http://dart-ngo.gr/tutorials/747-gnupg-email-encryption-using-thunderbird-tutorial](http://dart-ngo.gr/tutorials/747-gnupg-email-encryption-using-thunderbird-tutorial)
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
---
|
||||
title: "Using GnuPG/PGP for Email Encryption in Thunderbird (2012)"
|
||||
url: "tutorials/using-gnupg-pgp-for-email-encryption-in-thunderbird-2012"
|
||||
description: "To safeguard sensitive email content, we can utilize GnuPG/PGP. GnuPG/PGP is employed to encrypt the body or message of an email."
|
||||
summary: "To safeguard sensitive email content, we can utilize GnuPG/PGP. GnuPG/PGP is employed to encrypt the body or message of an email."
|
||||
# linkTitle:
|
||||
date: 2012-07-29T19:47:55+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- Privacy
|
||||
- Security
|
||||
tags:
|
||||
- PGP
|
||||
- Thunderbird
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
In a previous article [About Email and Privacy]({{< ref "/blog/note-about-email-and-privacy/index.md" >}} "About Email and Privacy"), we discussed how email systems work, how emails are intercepted, analyzed header data, and briefly outlined ways to protect our email privacy. On this occasion, we wish to share with you how to use GnuPG for encrypting the content of an email.
|
||||
|
||||
When sharing information via email with friends or colleagues, it is not uncommon to include sensitive data such as email addresses, usernames, passwords,
|
||||
or other confidential information. To safeguard this sensitive content, we can utilize **GnuPG**. **GnuPG** is employed to encrypt the body or message of
|
||||
an email.
|
||||
|
||||
By employing this method, the exchange of information requires prior consent between the sender and recipient through the exchange of a **"public key"**,
|
||||
thereby ensuring that the message is much more secure in terms of confidentiality.
|
||||
|
||||
In this tutorial, we will utilize software **GnuPG** integrated with **Thunderbird**. The author prefers **Thunderbird** as a mail client because it is
|
||||
available on various operating systems. Additionally, **Thunderbird** provides several features/extensions, such as **Enigmail**, which enables us to
|
||||
perform encryption, decryption, and provide PGP signatures.
|
||||
|
||||
The following tools are required or used by the author for this guide:
|
||||
|
||||
- Linux Operating System
|
||||
- [GnuPG](https://www.gnupg.org/)
|
||||
- [Mozilla Thunderbird](https://www.thunderbird.net/)
|
||||
- [Enigmail](http://enigmail.mozdev.org/download/index.php.html)
|
||||
|
||||
Before proceeding, I assume that you have successfully installed **GnuPG**, **Thunderbird**, and the **Enigmail** plugin on your operating system.
|
||||
|
||||
## Creating a PGP Key with GnuPG
|
||||
|
||||
After downloading **GnuPG** and installing it, we can _generate_ a **PGP key** by running the command: `gpg --gen-key`. You will then have several _options_ for your generated _key_, including _key type_, _key size_, how long the key is _valid_, and _passphrase key_ for your PGP key.
|
||||
|
||||
```plain
|
||||
Please select what kind of key you want:
|
||||
(1) RSA and RSA (default)
|
||||
(2) DSA and Elgamal
|
||||
(3) DSA (sign only)
|
||||
(4) RSA (sign only)
|
||||
Your selection? 1
|
||||
```
|
||||
|
||||
First, we select option number 1 (`RSA and RSA`) which enables us to perform both _encryption_ and _signature_ of messages.
|
||||
|
||||
```plain
|
||||
RSA keys may be between 1024 and 4096 bits long.
|
||||
What keysize do you want? (2048) 2048
|
||||
Requested keysize is 2048 bits
|
||||
```
|
||||
|
||||
Next, we choose the desired **keysize**. By default, the program GPG uses a value of `2048`. Enter `2048` and press enter.
|
||||
|
||||
```plain
|
||||
Please specify how long the key should be valid.
|
||||
0 = key does not expire
|
||||
<n> = key expires in n days
|
||||
<n>w = key expires in n weeks
|
||||
<n>m = key expires in n months
|
||||
<n>y = key expires in n years
|
||||
Key is valid for? (0) 1y
|
||||
Key expires at Sun 27 Jul 2013 05:55:36 PM WIT
|
||||
Is this correct? (y/N) y
|
||||
```
|
||||
|
||||
Then, we determine how long the key is valid. In this example, I made the key valid for **1 year**. Enter `1y` and press enter.
|
||||
|
||||
```plain
|
||||
GnuPG needs to construct a user ID to identify your key.
|
||||
|
||||
Real name: Tutorial PGP
|
||||
Email address: test@crayoncreative.web.id
|
||||
Comment: Untuk contoh tutor PGP
|
||||
You selected this USER-ID:
|
||||
"Tutorial PGP (Untuk contoh tutor PGP) <test@crayoncreative.web.id>"
|
||||
|
||||
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
|
||||
You need a Passpharse to protect your secret key.
|
||||
```
|
||||
|
||||
The next step is to provide a **user ID** to identify the key we are creating. The user ID includes your original name, email address, and comment. Fill in all the forms and then type `O` and press enter.
|
||||
|
||||
After that, a _popup_ will appear with a form to fill in the **passphrase key**, as shown in the picture below:
|
||||
|
||||
![gpg gen-key](pgp-thunderbird-01.png#center)
|
||||
|
||||
Fill in the **passphrase key** which will serve as a password for using your PGP Key and decrypting messages. Press the `Ok` button, then wait for a few seconds, and you will see a _summary key_ with information such as expiration date, owner's name, and others. As shown on the picture, my **PGP public key** is `D47A605E`.
|
||||
|
||||
![gpg gen-key2](pgp-thunderbird-02.png#center)
|
||||
|
||||
## Using PGP in Thunderbird with Enigmail
|
||||
|
||||
Open your **Thunderbird** program, select option **OpenPGP** > **Key Management**. Then, a list of keys available on our system will appear, as shown in the picture below:
|
||||
|
||||
![OpenPGP management Thunderbird](pgp-thunderbird-03.png#center)
|
||||
|
||||
Make sure your **public key ID** on **OpenPGP** is the same as what you just created. Then, to perform testing, we can send an email to `adele-en@gnupp.de` (_PGP Email Robot_) with our _public key_ attached. The way to do it is by selecting menu **OpenPGP** > **Attach Public Key**.
|
||||
|
||||
![OpenPGP attach public key](pgp-thunderbird-04.png#center)
|
||||
|
||||
Then, a _popup list PGP key_ will appear. Select the PGP key according to the email we use (`D47A605E`) by checking the box on the left side of Account / User ID.
|
||||
|
||||
![List PGP keys](pgp-thunderbird-05.png#center)
|
||||
|
||||
Send your message, and then after a few seconds you will receive an email reply from **Adele**:
|
||||
|
||||
![List PGP keys](pgp-thunderbird-06.png#center)
|
||||
|
||||
Enter your **passphrase key PGP key** to find out the contents of the message. It should appear like the picture below:
|
||||
|
||||
![](pgp-thunderbird-07.png#center)
|
||||
|
||||
After successfully emailing with the _"Robot"_, it's time to try emailing with a real person. (_Find someone who is already familiar with using PGP and exchange Public Keys 1 same as each other_) In the **OpenPGP** menu, check the options **Sign Message** and **Encrypt Message**. (Make sure the pencil and key icons on the bottom right are yellow).
|
||||
|
||||
![Open PGP button Thunderbird](pgp-thunderbird-08.png#center)
|
||||
|
||||
Send the message, and then only someone who has a complete _PGP key_ and knows their _passphrase key_- can read the message.
|
||||
|
||||
![Open PGP button Thunderbird](pgp-thunderbird-09.png#center)
|
||||
|
||||
I hope this guide helps you who want to pay more attention to privacy when exchanging messages through email.
|
||||
|
||||
Sources:
|
||||
|
||||
- [http://enigmail.mozdev.org/documentation/quickstart.php.html](http://enigmail.mozdev.org/documentation/quickstart.php.html)
|
||||
- [http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html](http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html)
|
||||
- [http://dart-ngo.gr/tutorials/747-gnupg-email-encryption-using-thunderbird-tutorial](http://dart-ngo.gr/tutorials/747-gnupg-email-encryption-using-thunderbird-tutorial)
|
|
@ -1,6 +1,7 @@
|
|||
---
|
||||
title: "SSH Client - Server (Security & Simplicity)"
|
||||
description: Berbagi trik untuk sedikit lebih memperketat akses SSH dengan men-disable root akses SSH, mengubah port default dan menggunakan public dan private key.
|
||||
summary: Berbagi trik untuk sedikit lebih memperketat akses SSH dengan men-disable root akses SSH, mengubah port default dan menggunakan public dan private key.
|
||||
# linkTitle:
|
||||
date: 2012-05-17T17:09:21+07:00
|
||||
lastmod:
|
||||
|
@ -8,10 +9,6 @@ draft: false
|
|||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
# nav_icon:
|
||||
# vendor: bootstrap
|
||||
# name: toggles
|
||||
# color: '#e24d0e'
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
|
@ -21,60 +18,60 @@ tags:
|
|||
- Linux
|
||||
- SSH
|
||||
images:
|
||||
# menu:
|
||||
# main:
|
||||
# weight: 100
|
||||
# params:
|
||||
# icon:
|
||||
# vendor: bs
|
||||
# name: book
|
||||
# color: '#e24d0e'
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
Bagi para **System Administrator**, sebagai pengganti **Telnet** penggunaan **SSH** pasti sudah merupakan makanan sehari-hari yang banyak digunakan untuk mengakses sistem berbasis **Linux/Unix**. Meskipun password yang dikirim ke server sudah dienkripsi dan tidak berbentuk *plaintext* lagi, installasi [OpenSSH](https://www.openssh.com/) secara default dirasa kurang aman.
|
||||
Bagi para **System Administrator**, sebagai pengganti **Telnet** penggunaan **SSH** pasti sudah merupakan makanan sehari-hari yang banyak digunakan untuk mengakses sistem berbasis **Linux/Unix**. Meskipun password yang dikirim ke server sudah dienkripsi dan tidak berbentuk _plaintext_ lagi, installasi [OpenSSH](https://www.openssh.com/) secara default dirasa kurang aman.
|
||||
|
||||
<!--more-->
|
||||
|
||||
Kali ini saya ingin berbagi trik yang sebenarnya sudah umum, untuk sedikit lebih memperketat akses SSH. Yaitu men-*disable* akses SSH untuk *user* `root`, menggunakan **public dan private key**, sampai mengubah *port default*. Selain itu saya juga ingin sedikit berbagi trik agar proses memanage server(s) menjadi lebih mudah dan simple.
|
||||
Kali ini saya ingin berbagi trik yang sebenarnya sudah umum, untuk sedikit lebih memperketat akses SSH. Yaitu men-_disable_ akses SSH untuk _user_ `root`, menggunakan **public dan private key**, sampai mengubah _port default_. Selain itu saya juga ingin sedikit berbagi trik agar proses memanage server(s) menjadi lebih mudah dan simple.
|
||||
|
||||
Pada diskusi kali ini dibutuhkan (atau saya menggunakan) :
|
||||
* Client PC : **Linux** dengan *desktop environment* **KDE** `4.8`.
|
||||
* Server SSH (Remote PC) : Linux dengan IP `202.150.169.245`.
|
||||
* Mengerti sedikit dasar Linux CLI seperti `chmod`, `ssh`, `groupadd`, `useradd`.
|
||||
* Mampu menggunakan text editor seperti `vi`/`vim`/`nano`/`pico`, dll.
|
||||
* dan setumpuk kesabaran yang ditumis dengan rasa keingintahuan (yang ini lupakan).
|
||||
|
||||
- Client PC : **Linux** dengan _desktop environment_ **KDE** `4.8`.
|
||||
- Server SSH (Remote PC) : Linux dengan IP `202.150.169.245`.
|
||||
- Mengerti sedikit dasar Linux CLI seperti `chmod`, `ssh`, `groupadd`, `useradd`.
|
||||
- Mampu menggunakan text editor seperti `vi`/`vim`/`nano`/`pico`, dll.
|
||||
- dan setumpuk kesabaran yang ditumis dengan rasa keingintahuan (yang ini lupakan).
|
||||
|
||||
## Disable Akses root Melalui SSH
|
||||
`Root` *user* adalah user yang pasti ada pada sistem Unix/Unix-Like, jika kita tidak mendisable user tersebut, maka akan mempermudah pentester melakukan serangan bruteforce.
|
||||
|
||||
Sebelum mendisable akses `root`, tentu saja kita perlu membuat 1 user baru yang mempunyai hak untuk menggunakan *service* SSH dan masuk ke dalam list `sudoers`.
|
||||
`Root` _user_ adalah user yang pasti ada pada sistem Unix/Unix-Like, jika kita tidak mendisable user tersebut, maka akan mempermudah pentester melakukan serangan bruteforce.
|
||||
|
||||
Sebelum mendisable akses `root`, tentu saja kita perlu membuat 1 user baru yang mempunyai hak untuk menggunakan _service_ SSH dan masuk ke dalam list `sudoers`.
|
||||
|
||||
1. Akses ssh server menggunakan _user_ `root` terlebih dahulu.
|
||||
|
||||
1. Akses ssh server menggunakan *user* `root` terlebih dahulu.
|
||||
```bash
|
||||
ssh root@202.150.169.245
|
||||
```
|
||||
2. setelah masuk server SSH, buat user dan *group* baru. (Silahkan lihat `man useradd` untuk lebih jelas)
|
||||
|
||||
2. setelah masuk server SSH, buat user dan _group_ baru. (Silahkan lihat `man useradd` untuk lebih jelas)
|
||||
|
||||
```bash
|
||||
groupadd ditatompel
|
||||
useradd -s /bin/bash -d /home/ditatompel -g ditatompel -G root -m ditatompel
|
||||
```
|
||||
|
||||
3. Set password user tersebut dengan perintah `passwd ditatompel`.
|
||||
|
||||
![Create User](create-user.png#center)
|
||||
|
||||
4. Lalu tambahkan user `ditatompel` ke list `sudoers`. Edit file `/etc/sudoers` dan tambahkan permission untuk user baru tersebut:
|
||||
|
||||
```plain
|
||||
ditatompel ALL=(ALL) ALL
|
||||
```
|
||||
|
||||
5. Kemudian edit file `/etc/ssh/sshd_config` dan tambah / edit konfigurasi berikut :
|
||||
|
||||
```plain
|
||||
PermitRootLogin no
|
||||
AllowUsers ditatompel
|
||||
```
|
||||
6. Restart SSH *daemon*
|
||||
|
||||
6. Restart SSH _daemon_
|
||||
|
||||
```bash
|
||||
service sshd restart #(Untuk CentOS dkk)
|
||||
/etc/init.d/ssh restart #(untuk Debian)
|
||||
|
@ -84,31 +81,35 @@ service sshd restart #(Untuk CentOS dkk)
|
|||
> _**Note** : Setelah restart, pastikan akses SSH yang sedang berjalan / terkoneksi tidak putus / di close supaya kita masih memiliki akses dan dapat mengedit konfigurasi jika terjadi kesalahan._
|
||||
|
||||
7. Coba akses SSH server menggunakan user yang tadi baru saja kita buat, yaitu `ditatompel`.
|
||||
|
||||
```bash
|
||||
ssh ditatompel@202.150.169.245
|
||||
```
|
||||
|
||||
## Ubah Port Default SSH (Optional)
|
||||
Mengubah port default SSH (`22`) dapat menghindari *bruteforcer ababail* yg cuma ambil script dari internet karena kebanyakan script *bruteforce* SSH defaultnya melakukan brute ke port `22`.
|
||||
|
||||
Mengubah port default SSH (`22`) dapat menghindari _bruteforcer ababail_ yg cuma ambil script dari internet karena kebanyakan script _bruteforce_ SSH defaultnya melakukan brute ke port `22`.
|
||||
|
||||
**NOTE** : Jika firewall server aktif, kita perlu membuka akses ke port yang baru, misalnya jika kita menggunakan `iptables`:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -p tcp --dport 1337 -j ACCEPT
|
||||
iptables save
|
||||
service iptables restart
|
||||
```
|
||||
|
||||
* Ingat, jangan menutup koneksi SSH awal yang sudah terhubung untuk menghindari hal2 yang tidak diinginkan.
|
||||
|
||||
- Ingat, jangan menutup koneksi SSH awal yang sudah terhubung untuk menghindari hal2 yang tidak diinginkan.
|
||||
|
||||
Kemudian, untuk mengubah port, edit file `/etc/ssh/sshd_config` dan tambah / edit konfigurasi berikut :
|
||||
|
||||
```plain
|
||||
Port 1337
|
||||
```
|
||||
|
||||
kemudian restart SSH daemon.
|
||||
|
||||
Seperti yang kita lihat, SSH daemon melakukan listen di port `1337`. Untuk memastikannya bisa menggunakan perintah `netstat`.
|
||||
|
||||
```bash
|
||||
netstat -plnt
|
||||
```
|
||||
|
@ -116,15 +117,19 @@ netstat -plnt
|
|||
Terakhir, selalu test lagi apakah server kita bisa diakses.
|
||||
|
||||
## Gunakan Public dan Private Key
|
||||
1. Buat dulu *keypair* untuk SSH client dan SSH server dengan menggunakan `ssh-keygen`.
|
||||
|
||||
1. Buat dulu _keypair_ untuk SSH client dan SSH server dengan menggunakan `ssh-keygen`.
|
||||
|
||||
```bash
|
||||
ssh-keygen -b 4048 -f serverLama-169-245 -t rsa -C "ditatompel@serverLama-169-245"
|
||||
```
|
||||
|
||||
Maka ia akan membuat file bernama `serverLama-169-245` dan `serverLama-169-245.pub` dimana :
|
||||
|
||||
`serverLama-169-245` adalah **private key** kita, dan `serverLama-169-245.pub` adalah **public key** yang nantinya diletakan letakkan di server kita.
|
||||
|
||||
2. Pindahkan ke 2 file tersebut ke folder `~/.ssh` dan ubah file permissionnya menjadi `600`.
|
||||
|
||||
```bash
|
||||
mv serverLama-169-245 serverLama-169-245.pub ~/.ssh/
|
||||
find ~/.ssh/ -type f -exec chmod 600 {} +
|
||||
|
@ -132,12 +137,13 @@ find ~/.ssh/ -type f -exec chmod 600 {} +
|
|||
|
||||
![SSH-keygen](sshkeygen.jpg#center)
|
||||
|
||||
3. Pada komputer server dengan user yang baru kita buat tadi (`ditatompel`) buat *hidden folder* `.ssh` pada *home dir*nya dan ubah folder permissionnya menjadi `700`.
|
||||
3. Pada komputer server dengan user yang baru kita buat tadi (`ditatompel`) buat _hidden folder_ `.ssh` pada *home dir*nya dan ubah folder permissionnya menjadi `700`.
|
||||
|
||||
```bash
|
||||
mkdir ~/.ssh; chmod 700 ~/.ssh
|
||||
```
|
||||
|
||||
4. Copy **public key** yang tadi kita buat ke folder `~/.ssh` pada remote PC (*SSH Server*) dengan nama `authorized_keys` dan file permission `600`
|
||||
4. Copy **public key** yang tadi kita buat ke folder `~/.ssh` pada remote PC (_SSH Server_) dengan nama `authorized_keys` dan file permission `600`
|
||||
|
||||
(untuk meng*copy file* tersebut bisa menggunakan `sftp` / `scp`) : Contoh :
|
||||
|
||||
|
@ -158,7 +164,9 @@ sftp> chmod 600 /home/ditatompel/.ssh/authorized_keys
|
|||
```plain
|
||||
PasswordAuthentication no
|
||||
```
|
||||
6. Restart SSH *daemon* dan coba lagi akses SSH server dengan menggunakan command :
|
||||
|
||||
6. Restart SSH _daemon_ dan coba lagi akses SSH server dengan menggunakan command :
|
||||
|
||||
```bash
|
||||
ssh -i ~/.ssh/serverLama-169-245 -p 1337 ditatompel@202.150.169.245
|
||||
```
|
||||
|
@ -166,13 +174,15 @@ ssh -i ~/.ssh/serverLama-169-245 -p 1337 ditatompel@202.150.169.245
|
|||
![SSH pass](ssh-pass.png#center)
|
||||
|
||||
## Memanage Server Menggunakan FISH Protocol
|
||||
|
||||
Ni bagian yang saya suka dan yang sebenernya pingin saya share, mungkin aja ada beberapa yang belum tau.
|
||||
|
||||
**FISH** (*Files transferred over Shell protocol*) adalah sebuah protokol jaringan yang menggunakan **Secure Shell (SSH)** atau **Remote Shell (RSH)** untuk mentransfer file antara komputer kita dan komputer server semudah membuka2 folder / mengedit file di komputer kita. Saya menggunakan **Dolphin** yang sudah menjadi bawaan **KDE**. Selain Dolphin, KDE user juga bisa menggunakan `Konqueror` untuk menggunakan protokol FISH. (Untuk **Gnome** - **Nautilus** saya kurang tahu, mungkin yang lain bisa menambahkan dimari)
|
||||
**FISH** (_Files transferred over Shell protocol_) adalah sebuah protokol jaringan yang menggunakan **Secure Shell (SSH)** atau **Remote Shell (RSH)** untuk mentransfer file antara komputer kita dan komputer server semudah membuka2 folder / mengedit file di komputer kita. Saya menggunakan **Dolphin** yang sudah menjadi bawaan **KDE**. Selain Dolphin, KDE user juga bisa menggunakan `Konqueror` untuk menggunakan protokol FISH. (Untuk **Gnome** - **Nautilus** saya kurang tahu, mungkin yang lain bisa menambahkan dimari)
|
||||
|
||||
Caranya tinggal klik pada *breadcrumb* navigasi folder dan ketikan `{protokol}{user}@{server}:{port}/{folder}` kemudian tekan enter.
|
||||
Caranya tinggal klik pada _breadcrumb_ navigasi folder dan ketikan `{protokol}{user}@{server}:{port}/{folder}` kemudian tekan enter.
|
||||
|
||||
misalnya :
|
||||
|
||||
```plain
|
||||
fish://ditatompel@202.150.169.245:1337/var/www/path/to/folder/you/want/to/access/
|
||||
```
|
||||
|
@ -180,7 +190,8 @@ fish://ditatompel@202.150.169.245:1337/var/www/path/to/folder/you/want/to/access
|
|||
![Fish protocol](fish.png#center)
|
||||
setelah itu kita akan dipromot untuk memasukan password SSH kita. Tapi ada permasalahan yang dihadapi, protokol FISH pada Dolphin / Konqueror tidak secara langsung tahu jika kita menggunakan public dan private key untuk mengakses server.
|
||||
|
||||
Maka dari itu kita dapat memanfaatkan fitur **ssh config** (lokasinya ada di `~/.ssh/config` untuk konfigurasi per user, atau `/etc/ssh/sshd_config` untuk *system wide*). Untuk konfigurasi tiap user, biasanya belum terdapat file `~/.ssh/config`, maka dari itu kita perlu buat dulu file tersebut dengan menambahkan konfigurasi `IdentityFile` supaya program yang kita gunakan tau bahwa kita harus menggunakan **private key** SSH kita :
|
||||
Maka dari itu kita dapat memanfaatkan fitur **ssh config** (lokasinya ada di `~/.ssh/config` untuk konfigurasi per user, atau `/etc/ssh/sshd_config` untuk _system wide_). Untuk konfigurasi tiap user, biasanya belum terdapat file `~/.ssh/config`, maka dari itu kita perlu buat dulu file tersebut dengan menambahkan konfigurasi `IdentityFile` supaya program yang kita gunakan tau bahwa kita harus menggunakan **private key** SSH kita :
|
||||
|
||||
```plain
|
||||
IdentityFile /home/dit/.ssh/serverlama-169-245
|
||||
```
|
||||
|
@ -188,9 +199,11 @@ IdentityFile /home/dit/.ssh/serverlama-169-245
|
|||
Lalu bagaimana jika kita memiliki banyak server dan banyak **private key** untuk masing2 server? Yuk mari kita baca lanjutannya.
|
||||
|
||||
## Trik Konfigurasi ~/.ssh/config
|
||||
|
||||
Untuk para system administrator yang ngurusin banyak server yang mengharuskan tiap server memiliki akses login yang berbeda,pasti bakal susah mengingat port, password, user, dll. Belum lagi untuk inget akses aplikasi yang ada pada server2 tersebut. Maka dari itu kita bisa manfaatin fitur ssh config yang memungkinkan kita mengakses shell hanya dengan mengingat IP server dan passpharsenya saja.
|
||||
|
||||
Berikut ini contoh konfigurasi SSH untuk identitas multi server :
|
||||
|
||||
```plain
|
||||
Host 202.150.169.245
|
||||
Hostname 202.150.169.245
|
||||
|
@ -220,12 +233,15 @@ Dengan begitu kita dapat menggunakan command SSH hanya dengan :
|
|||
```bash
|
||||
ssh 202.150.169.245
|
||||
```
|
||||
atau dengan menambahkannya ke folder *network* dengan mengakses **Network** > **Add Network Folder** kemudian isi informasi remote PC (SSH server) yang dibutuhkan.
|
||||
|
||||
atau dengan menambahkannya ke folder _network_ dengan mengakses **Network** > **Add Network Folder** kemudian isi informasi remote PC (SSH server) yang dibutuhkan.
|
||||
|
||||
![Fish Protocol](fish-protocol1.png#center)
|
||||
|
||||
Mungkin sekian dulu dari saya, silahkan bagi teman2 yang ingin menambahkan / mengkoreksi, saya akan sangat menghargai.
|
||||
|
||||
Referensi:
|
||||
* [http://linux.die.net/man/5/ssh_config](http://linux.die.net/man/5/ssh_config).
|
||||
* [http://kb.mediatemple.net/questions/1625/Using+an+SSH+Config+File](http://kb.mediatemple.net/questions/1625/Using+an+SSH+Config+File).
|
||||
|
||||
- [http://linux.die.net/man/5/ssh_config](http://linux.die.net/man/5/ssh_config).
|
||||
- [http://kb.mediatemple.net/questions/1625/Using+an+SSH+Config+File](http://kb.mediatemple.net/questions/1625/Using+an+SSH+Config+File).
|
||||
|
||||
|
|
246
content/tutorials/ssh-client-server-security-simplicity/index.md
Normal file
246
content/tutorials/ssh-client-server-security-simplicity/index.md
Normal file
|
@ -0,0 +1,246 @@
|
|||
---
|
||||
title: "SSH Client - Server (Security & Simplicity)"
|
||||
description: Hardening SSH access by disabling root SSH access, change the default port, and utilize public and private keys.
|
||||
summary: Hardening SSH access by disabling root SSH access, change the default port, and utilize public and private keys.
|
||||
# linkTitle:
|
||||
date: 2012-05-17T17:09:21+07:00
|
||||
lastmod:
|
||||
draft: false
|
||||
noindex: false
|
||||
# comments: false
|
||||
nav_weight: 1000
|
||||
series:
|
||||
# - Tutorial
|
||||
categories:
|
||||
- SysAdmin
|
||||
- Security
|
||||
tags:
|
||||
- Linux
|
||||
- SSH
|
||||
images:
|
||||
authors:
|
||||
- ditatompel
|
||||
---
|
||||
|
||||
For System Administrators, using **SSH** instead of **Telnet** is likely a daily routine when accessing Linux/Unix-based systems. Although the password transmitted to the server has been encrypted and no longer appears as plaintext, the default installation of OpenSSH is considered somewhat insecure.
|
||||
|
||||
This time, I'd like to share some common tricks for tightening up SSH access. This includes disabling SSH access for the root user, utilizing public and private keys, and even modifying the default port. Additionally, I'll be sharing a few tips to make server management easier and simpler.
|
||||
|
||||
To participate in this discussion, you should have:
|
||||
|
||||
- A client PC with Linux running KDE 4.8.
|
||||
- A remote SSH server (Remote PC) with an IP address of 202.150.169.245.
|
||||
- Basic understanding of Linux command-line interfaces, such as `chmod`, `ssh`, `groupadd`, and `useradd`.
|
||||
- The ability to use text editors like `vi`/`vim`/`nano`/`pico`, etc.
|
||||
|
||||
## Disabling Root Access via SSH
|
||||
|
||||
The "root" user is undoubtedly present on Unix/Unix-like systems. If we don't disable this user, it will make it easier for attackers to perform brute-force attacks against the root account.
|
||||
|
||||
Before disabling root access, we need to create a new user with the right to use the SSH service and add them to the sudoers list.
|
||||
|
||||
1. Access the SSH server using the "root" user first.
|
||||
|
||||
```bash
|
||||
ssh root@202.150.169.245
|
||||
```
|
||||
|
||||
2. Once logged in to the SSH server, create a new user and group. (You can refer to `man useradd` for more information)
|
||||
|
||||
```bash
|
||||
groupadd ditatompel
|
||||
useradd -s /bin/bash -d /home/ditatompel -g ditatompel -G root -m ditatompel
|
||||
```
|
||||
|
||||
3. Set the password for this new user with the command `passwd ditatompel`.
|
||||
|
||||
![Create User](create-user.png#center)
|
||||
|
||||
4. Then, add the "ditatompel" user to the sudoers list. Edit the `/etc/sudoers` file and add the following permission:
|
||||
|
||||
```plain
|
||||
ditatompel ALL=(ALL) ALL
|
||||
```
|
||||
|
||||
5. Next, edit the `/etc/ssh/sshd_config` file and add/edit the following configuration:
|
||||
|
||||
```plain
|
||||
PermitRootLogin no
|
||||
AllowUsers ditatompel
|
||||
```
|
||||
|
||||
6. Restart the SSH daemon:
|
||||
|
||||
```bash
|
||||
service sshd restart #(For CentOS, etc.)
|
||||
/etc/init.d/ssh restart #(for Debian)
|
||||
/etc/rc.d/sshd restart #(FreeBSD, Arch, Gentoo, etc.)
|
||||
```
|
||||
|
||||
> **Important:** After restarting, ensure that any currently connected SSH sessions do not get terminated or closed so you can still access and edit the configuration if there's an error.
|
||||
|
||||
7. Try accessing the SSH server using the new user, which is "ditatompel".
|
||||
|
||||
```bash
|
||||
ssh ditatompel@202.150.169.245
|
||||
```
|
||||
|
||||
## Changing the Default SSH Port (Optional)
|
||||
|
||||
Changing the default SSH port (`22`) can help prevent brute-force attacks that simply grab scripts from the internet since most brute-force SSH scripts default to port `22` for their attack attempts.
|
||||
|
||||
**NOTE:** If your server's firewall is active, you'll need to open access to the new port, for example if you're using `iptables`:
|
||||
|
||||
```bash
|
||||
iptables -A INPUT -p tcp --dport 1337 -j ACCEPT
|
||||
iptables save
|
||||
service iptables restart
|
||||
```
|
||||
|
||||
- Remember not to close any existing SSH connections that are already connected to avoid unwanted issues.
|
||||
|
||||
Next, to change the port, edit the `/etc/ssh/sshd_config` file and add/edit the following configuration:
|
||||
|
||||
```plain
|
||||
Port 1337
|
||||
```
|
||||
|
||||
Then, restart the SSH daemon.
|
||||
|
||||
As we can see, the SSH daemon is now listening on port `1337`. To confirm this, you can use the `netstat` command.
|
||||
|
||||
```bash
|
||||
netstat -plnt
|
||||
```
|
||||
|
||||
Finally, always test again to ensure that your server can be accessed.
|
||||
|
||||
## Using Public and Private Keys
|
||||
|
||||
1. First, create a _keypair_ for SSH client and SSH server using `ssh-keygen`.
|
||||
|
||||
```bash
|
||||
ssh-keygen -b 4048 -f oldServer-169-245 -t rsa -C "ditatompel@oldServer-169-245"
|
||||
```
|
||||
|
||||
This will generate two files: `oldServer-169-245` (private key) and `oldServer-169-245.pub` (public key). The former is our private key, while the latter is our public key that we'll place on our server.
|
||||
|
||||
2. Move these two files to the `~/.ssh` directory and change their permissions to `600`.
|
||||
|
||||
```bash
|
||||
mv oldServer-169-245 oldServer-169-245.pub ~/.ssh/
|
||||
find ~/.ssh/ -type f -exec chmod 600 {} +
|
||||
```
|
||||
|
||||
![SSH-keygen](sshkeygen.jpg#center)
|
||||
|
||||
3. On the server, create a hidden directory `.ssh` in the user's home directory (`ditatompel`) and change its permissions to `700`.
|
||||
|
||||
```bash
|
||||
mkdir ~/.ssh; chmod 700 ~/.ssh
|
||||
```
|
||||
|
||||
4. Copy our public key to the remote PC (_SSH Server_) with the name `authorized_keys` and file permission `600`. (You can use `sftp` or `scp` to copy the file):
|
||||
|
||||
Example:
|
||||
|
||||
```bash
|
||||
cd ~/.ssh
|
||||
sftp -P 1337 ditatompel@202.150.169.245
|
||||
```
|
||||
|
||||
```plain
|
||||
sftp> put oldServer-169-245.pub /home/ditatompel/.ssh/authorized_keys
|
||||
sftp> chmod 600 /home/ditatompel/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
![SFTP](sftp.png#center)
|
||||
|
||||
5. After that, edit the file `/etc/ssh/sshd_config` and add/configure the following to prevent users from accessing shells even if they know the password, and force them to use private keys:
|
||||
|
||||
```plain
|
||||
PasswordAuthentication no
|
||||
```
|
||||
|
||||
6. Restart SSH _daemon_ and try again with the command:
|
||||
|
||||
```bash
|
||||
ssh -i ~/.ssh/oldServer-169-245 -p 1337 ditatompel@202.150.169.245
|
||||
```
|
||||
|
||||
![SSH pass](ssh-pass.png#center)
|
||||
|
||||
## Managing Server Using FISH Protocol
|
||||
|
||||
This is my favorite part, and I think there might be some people who don't know about it yet.
|
||||
|
||||
**FISH** (_Files transferred over Shell protocol_) is a network protocol that uses **Secure Shell (SSH)** or **Remote Shell (RSH)** to transfer files between computers. We use **Dolphin**, which is already built-in with **KDE**. In addition to Dolphin, KDE users can also use `Konqueror` for the FISH protocol. For Gnome users, you can also use `Nautilus` with a third-party plugin.
|
||||
|
||||
To do this, simply click on the breadcrumb navigation directory and type `{protocol}{user}@{server}:{port}/{directory}` and press Enter.
|
||||
|
||||
Example :
|
||||
|
||||
```plain
|
||||
fish://ditatompel@202.150.169.245:1337/var/www/path/to/directory/you/want/to/access/
|
||||
```
|
||||
|
||||
![Fish protocol](fish.png#center)
|
||||
|
||||
After that, we will be prompted to enter our SSH password. However, there is a problem that FISH protocol on Dolphin/Konqueror does not know whether we are using public and private keys to access the server.
|
||||
|
||||
So, we can take advantage of the **ssh config** feature (located in `~/.ssh/config` for per-user configuration or `/etc/ssh/sshd_config` for system-wide).
|
||||
|
||||
For per-user configuration, there is usually no file `~/.ssh/config`, so we need to create it first by adding a configuration `IdentityFile` so that the program knows that we must use our **private key** SSH:
|
||||
|
||||
```plain
|
||||
IdentityFile /home/dit/.ssh/oldServer-169-245
|
||||
```
|
||||
|
||||
What if we have many servers and many private keys for each server? Let's continue reading.
|
||||
|
||||
## Configuring ~/.ssh/config
|
||||
|
||||
For system administrators responsible for managing numerous servers with diverse login access requirements, recalling port numbers, passwords, users, and so on can be a daunting task. Not to mention keeping track of application access on each server. Therefore, we can utilize the SSH config feature that enables us to access the shell by simply remembering the IP address and passphrase of each server.
|
||||
|
||||
Here is an example configuration for multi-server identities:
|
||||
|
||||
```plain
|
||||
Host 202.150.169.245
|
||||
Hostname 202.150.169.245
|
||||
User ditatompel
|
||||
Port 1337
|
||||
IdentityFile /home/dit/.ssh/oldServer-169-245
|
||||
|
||||
Host xxx.xx.xx.xxx
|
||||
HostName xxx.xx.xx.xxx
|
||||
User ditakeren
|
||||
Port 12345
|
||||
IdentityFile /home/dit/.ssh/blahblah1
|
||||
|
||||
Host xxx.xxx.xxx.xx
|
||||
Hostname xxx.xxx.xxx.xx
|
||||
User ditacakep
|
||||
Port 23213
|
||||
IdentityFile /home/dit/.ssh/blahblah2
|
||||
|
||||
# dan seterusnya
|
||||
```
|
||||
|
||||
![~/.ssh/config](ssh-config.png#center)
|
||||
|
||||
With this, we can use the SSH command with:
|
||||
|
||||
```bash
|
||||
ssh 202.150.169.245
|
||||
```
|
||||
|
||||
or by adding it to a network directory by accessing **Network** > **Add Network directory**, and filling in the necessary remote PC (SSH server) information.
|
||||
|
||||
![Fish Protocol](fish-protocol1.png#center)
|
||||
|
||||
That's all from me for now; please feel free to add or correct as you see fit, I would greatly appreciate it.
|
||||
|
||||
References:
|
||||
|
||||
- [http://linux.die.net/man/5/ssh_config](http://linux.die.net/man/5/ssh_config).
|
||||
- [http://kb.mediatemple.net/questions/1625/Using+an+SSH+Config+File](http://kb.mediatemple.net/questions/1625/Using+an+SSH+Config+File).
|
Loading…
Reference in a new issue