# Mengamankan Akses SSH di Ubuntu 22.04.2 LTS dengan Menggunakan Two-Factor Authentication (2FA)

<figure><img src="https://nos.wjv-1.neo.id/cdn.medusa.my.id/Authentication.png" alt=""><figcaption></figcaption></figure>

## Introduction

### SSH (Secure Shell)

[**SSH (Secure Shell)**](https://linux.die.net/man/1/ssh) sering digunakan untuk mengakses sistem operasi GNU/Linux dari jarak jauh, kita sering menggunakannya untuk terhubung ke komputer atau server yang berisi dengan data penting, sebagai solusi keamanan tambahan sangat disarankan untuk menambahkan lapisan keamanan lain seperti menggunakan Two-Factor Authentication (2FA).

### Two-Factor Authentication (2FA)

Two-Factor Authentication (2FA) adalah sebuah metode keamanan yang digunakan untuk mengamankan akases ke akun atau sistem dengan menggunakan dua faktor otentikasi yang berbeda. Two-Factor Authentication (2FA) tidak diciptakan oleh satu individu atau entitas tunggal, tetapi lebih merupakan evolusi dari konsep keamanan yang melibatkan lebih dari satu metode otentikasi untuk mengamankan akses ke akun atau sistem.&#x20;

Two-Factor Authentication (2FA) telah ada dalam berbagai bentuk selama beberapa dekade ini, dan perkembangannya terus berlanjut seiring dengan adanya kebutuhan akan solusi Cyber Security dalam kehidupan sehari-hari di era digital ini. Salah satu metode awal dari Two-Factor Authentication (2FA) melibatkan penggunaan kombinasi kata sandi dan token fisik yang hanya dimiliki oleh pengguna yang sah. Kemudian, metode Two-Factor Authentication (2FA) semakin berkembang dengan penggunaan otentikasi berbasis SMS, aplikasi otentikasi berbasis token, dan bahkan biometrik seperti sidik jari atau pengenalan wajah.

Banyak orang dan organisasi yang telah berkontribusi pada perkembangan konsep Two-Factor Authentication (2FA), sehingga tidak ada individu tunggal atau entitas yang dapat diidentifikasi sebagai pencipta eksklusifnya. Two-Factor Authentication (2FA) adalah hasil dari berbagai perkembangan teknologi dan konsep keamanan yang berkembang seiring waktu untuk meningkatkan tingkat keamanan akses ke akun dan sistem.

### Zero Trust

Two-Factor Authentication (2FA) juga merupakan sebuah elemen dasar dari model keamanan [**Zero Trust**](https://csrc.nist.gov/pubs/sp/800/207/final). Untuk melindungi data sensitif, kita harus memverifikasi bahwa pengguna yang mencoba mengakses data tersebut adalah orang yang sesuai dengan identitasnya. Two-Factor Authentication (2FA) merupakan cara yang efektif untuk melindungi data sensitif dari berbagai Cyber Threat yang menargetkan kata sandi dan akun pengguna, seperti teknik [**Phishing**](https://attack.mitre.org/techniques/T1598), [**Brute Force Attack**](https://attack.mitre.org/techniques/T1110), [**Credential Exploitation**](https://attack.mitre.org/techniques/T1212), dan banyak lagi.

### FIDO Alliance

Two-Factor Authentication (2FA) dan [**FIDO Alliance**](https://fidoalliance.org) memiliki keterkaitan, karena FIDO Alliance adalah salah satu organisasi yang berupaya mengembangkan standar keamanan otentikasi yang lebih kuat, yang dapat digunakan sebagai salah satu metode Two-Factor Authentication (2FA).

FIDO Alliance mengembangkan protokol dan standar otentikasi yang memungkinkan pengguna untuk menggantikan atau melengkapi otentikasi berbasis kata sandi dengan metode otentikasi yang lebih aman, seperti perangkat keras keamanan atau biometrik. Dalam konteks Two-Factor Authentication (2FA), FIDO Alliance dapat berperan dalam mengembangkan metode otentikasi kedua yang lebih aman.

Dengan bantuan spesifikasi dan standar yang dikembangkan oleh FIDO Alliance, organisasi dan penyedia layanan dapat mengimplementasikan solusi Two-Factor Authentication (2FA) yang lebih kuat dan lebih aman untuk melindungi akun dan data pengguna mereka. Jadi, Two-Factor Authentication (2FA) dapat memanfaatkan teknologi yang dikembangkan oleh FIDO Alliance sebagai salah satu cara untuk meningkatkan keamanan otentikasi.

### FIDO2

Misalnya, salah satu spesifikasi yang dikembangkan oleh FIDO Alliance adalah [**FIDO2**](https://fidoalliance.org/fido2), yang memungkinkan pengguna untuk menggunakan perangkat keamanan fisik seperti USB Security Key atau teknologi biometrik seperti pemindai sidik jari atau pengenalan wajah sebagai metode otentikasi kedua dalam Two-Factor Authentication (2FA). Ini memungkinkan pengguna untuk memasukkan sesuatu yang mereka ketahui (kata sandi) bersama dengan sesuatu yang mereka miliki (perangkat keamanan atau data biometrik) sebagai Two-Factor Authentication (2FA) yang berbeda.

### Perbedaan 2FA dengan MFA

Two-Factor Authentication (2FA) dan Multi-Factor Authentication (MFA) adalah dua konsep keamanan yang sering digunakan untuk melindungi akses ke akun dan sistem. Meskipun keduanya bertujuan untuk meningkatkan keamanan dengan memerlukan lebih dari satu faktor otentikasi, ada perbedaan penting antara keduanya:

#### **Two-Factor Authentication (2FA)**

1. **Dua Faktor:** 2FA, seperti namanya, melibatkan dua faktor otentikasi yang berbeda untuk mengakses akun atau sistem. Faktor-faktor ini biasanya adalah sesuatu yang kita ketahui seperti kata sandi dan sesuatu yang kita miliki seperti kode yang dikirim melalui SMS atau aplikasi otentikasi.
2. **Contoh:** Misalnya, ketika kita memasukkan kata sandi (faktor pertama), kita juga harus memasukkan kode yang dikirimkan ke ponsel kita melalui SMS atau aplikasi otentikasi (faktor kedua) untuk mengakses akun kita.
3. **Lebih Sederhana:** 2FA adalah bentuk dasar dari autentikasi multi-faktor yang paling sering digunakan, dan biasanya lebih sederhana dalam implementasinya.

#### **Multi-Factor Authentication (MFA)**

1. **Lebih dari Dua Faktor:** MFA adalah istilah yang lebih umum dan mencakup semua metode otentikasi yang melibatkan lebih dari dua faktor. Ini bisa melibatkan tiga atau lebih faktor otentikasi.
2. **Lebih Fleksibel:** MFA lebih fleksibel dan dapat melibatkan berbagai faktor otentikasi, termasuk sesuatu yang kita ketahui seperti kata sandi, sesuatu yang kita miliki seperti perangkat keamanan, kode SMS, biometrik seperti sidik jari atau pengenalan wajah.
3. **Lebih Kuat:** Karena melibatkan lebih banyak faktor, MFA umumnya dianggap lebih kuat dalam melindungi akses. Ini dapat membantu mengurangi risiko terhadap Cyber Threat yang diantaranya seperti teknik Phishing ataupun semua teknik yang masuk ke dalam kategori taktik [**Credential Access**](https://attack.mitre.org/tactics/TA0006).

Dalam banyak kasus, istilah 2FA dan MFA digunakan secara bergantian, tetapi penting untuk memahami perbedaannya. MFA adalah konsep yang lebih luas yang mencakup 2FA sebagai salah satu implementasi MFA. Pada dasarnya 2FA adalah subset dari MFA, yang di mana MFA memiliki lebih banyak pilihan dan fleksibilitas dalam penggunaan faktor otentikasi.

### Aplikasi 2FA Client

Ada beberapa aplikasi Two-Factor Authentication (2FA) yang dapat kita gunakan diantaranya seperti [**Google Authenticator**](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2)**,** [**Twilio Authy Authenticator**](https://authy.com/download), [**Duo Mobile**](https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app#download), [**2FAS**](https://2fas.com) dan banyak lagi.

## Installation

### Install Modul PAM Two-Factor Authentication

Untuk mengamankan akses SSH di sistem operasi atau distro Ubuntu 22.04.2 LTS terlebih dahulu kita perlu meng-install modul PAM untuk Two-Factor Authentication (2FA) dari Google dengan nama [**`libpam-google-authenticator`**](https://launchpad.net/ubuntu/jammy/+package/libpam-google-authenticator) dan berikut perintahnya:

{% code overflow="wrap" lineNumbers="true" %}

```bash
sudo apt update
sudo apt install libpam-google-authenticator
```

{% endcode %}

## Configuration

### Konfigurasi PAM

Setelah modul PAM untuk Two-Factor Authentication (2FA) dari Google berhasil ter-install, lakukan konfigurasi PAM untuk **`sshd`** dan letakkan konfigurasi pada baris paling akhir:

{% code overflow="wrap" lineNumbers="true" %}

```bash
sudo vi /etc/pam.d/sshd
```

{% endcode %}

{% hint style="warning" %}
{% code title="/etc/pam.d/sshd" %}

```markdown
# Google Authenticator PAM
auth required pam_google_authenticator.so
```

{% endcode %}
{% endhint %}

### Konfigurasi SSH

Setelah konfigurasi PAM untuk **`sshd`** selesai dilakukan, selanjutnya lakukan konfigurasi SSH pada bagian **`KbdInteractiveAuthentication`** dan **`PasswordAuthentication`** ubah value-nya menjadi **`yes`**,  jika sudah simpan konfigurasi dan lakukan restart service SSH:

{% code overflow="wrap" lineNumbers="true" %}

```bash
sudo vi /etc/ssh/sshd_config
sudo systemctl restart sshd
```

{% endcode %}

### Inisialisasi One-Time Passcode

Selanjutnya lakukan inisialisasi one-time passcode untuk user saat ini yang nantinya digunakan untuk melakukan akses SSH dengan menjalankan perintah berikut:

{% code overflow="wrap" lineNumbers="true" %}

```bash
google-authenticator
```

{% endcode %}

{% hint style="warning" %}
{% code title="Output" %}

```bash
Do you want authentication tokens to be time-based (y/n) y
Warning: pasting the following URL into your browser exposes the OTP secret to Google:
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@ubuntu-vm%3Fsecret%3DEFDC3JUIM4CJITQXUIE6UED554%26issuer%3Dubuntu-vm

█▀▀▀▀▀█ ▄▄█   █▀▄ █▀▀▀▀▀█
█ ███ █ ▀▄  ▄▄▀▄█ █ ███ █
█ ▀▀▀ █ █▀█ █ ▀█▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ █ █▄▀▄▀ █ ▀▀▀▀▀▀▀
█▀▄▀ ▄▀▀ ▄ ██▄▀▄  ▀█▀▄██▄
██ ▀█▄▀▄█▄▄███▀▄█▀▄ ▀▄▀  
▀ ▀▀▄▄▀▀█ ▀█ ▄█▄ ▀▀▄▄ ▄▀▀
▀▄ ██▄▀██ ▄█ ▀▀▄ ▀ ▀ ▄▄▄▀
▀▀ ▀ ▀▀▀▄▄█ ██▄▀█▀▀▀█▄█ ▄
█▀▀▀▀▀█ ▀▄▄▀█ █▀█ ▀ █   ▀
█ ███ █ ▄ ▀▄  ▄█▀▀██▀▄▀▄ 
█ ▀▀▀ █ ▄▀▄   ▄█ █▀▄▀▀█ █
▀▀▀▀▀▀▀ ▀   ▀    ▀▀ ▀   ▀

Your new secret key is: EFDC3JUIM4CJITQXUIE6UED554
Enter code from app (-1 to skip): 123456
Code confirmed
Your emergency scratch codes are:
  12345678
  23456789
  34567890
  45678901
  56789012

Do you want me to update your "/home/user/.google_authenticator" file? (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, a new token is generated every 30 seconds by the mobile app.
In order to compensate for possible time-skew between the client and the server,
we allow an extra token before and after the current time. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) n

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y
```

{% endcode %}
{% endhint %}

Setelah pada bagian **`Do you want authentication tokens to be time-based (y/n)`** selesai dilakukan, maka akan muncul URL dari QR Code atau gambar dari QR Code beserta Secret Key, kita dapat mengakses URL secara langsung melalui Web Browser dan kemudian melakukan scan QR Code tersebut, atau kita juga dapat melakukan scan langsung pada gambar QR Code yang muncul di terminal atau console, atau opsi lain kita dapat meng-input Secret Key secara manual pada aplikasi Two-Factor Authentication (2FA).

Selanjutanya masukan 6 digit kode otentikasi yang didapat dari aplikasi Two-Factor Authentication (2FA) pada bagian **`Enter code from app (-1 to skip)`**, kemudian ikuti langkah-langkah sesuai di atas sampai selesai.

## Testing

### Akses SSH Menggunakan 2FA

Jika proses inisialisasi one-time passcode untuk user sudah selesai, terakhir lakukan pengetesan akses SSH seperti pada umumnya dan pada bagian **`Verification code`** masukan 6 digit kode otentikasi yang didapat dari aplikasi Two-Factor Authentication (2FA) yang sudah kita install di smartphone dengan sistem operasi Android atau iOS:

{% code overflow="wrap" lineNumbers="true" %}

```bash
ssh user@123.45.67.89 -p666
```

{% endcode %}

{% hint style="success" %}
{% code title="Output" %}

```bash
(user@123.45.67.89) Password: 
(user@123.45.67.89) Verification code: 
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-79-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon Sep 11 09:51:00 PM UTC 2023

  System load:  0.00048828125      Processes:               218
  Usage of /:   16.6% of 47.41GB   Users logged in:         1
  Memory usage: 5%                 IPv4 address for ens192: 123.45.67.89
  Swap usage:   0%                 IPv4 address for ens224: 192.168.123.45

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


*** System restart required ***
Last login: Mon Sep 11 21:39:41 2023 from 234.56.78.90

```

{% endcode %}
{% endhint %}

### Menghapus One-Time Passcode

Jika kita ingin menghapus one-time passcode untuk user yang sebelumnya ter-generate, kita perlu meghapus file **`.google_authenticator`** yang tersimpan pada directory user dan juga menonkatifkan konfigurasi PAM untuk **`sshd`** yang terletak di file konfigurasi **`/etc/pam.d/sshd`** pada baris paling akhir:

{% code overflow="wrap" lineNumbers="true" %}

```bash
cd /home/user
sudo rm -rf .google_authenticator
sudo vi /etc/pam.d/sshd
```

{% endcode %}

{% hint style="warning" %}
{% code title="/etc/pam.d/sshd" %}

```markdown
# Google Authenticator PAM
#auth required pam_google_authenticator.so
```

{% endcode %}
{% endhint %}

Demikian sedikit pengetahuan dan pengalaman yang dapat saya bagikan, semoga apa yang telah saya sampaikan dapat bermanfaat bagi kita semua.

<details>

<summary><strong>Referensi</strong></summary>

* [**Configure SSH to use two-factor authentication**](https://ubuntu.com/tutorials/configure-ssh-2fa)
* [**How To Set Up Multi-Factor Authentication for SSH on Ubuntu 20.04**](https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-20-04)

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.madfxr.my.id/documentation/categories/cyber-security/mengamankan-akses-ssh-di-ubuntu-22.04.2-lts-dengan-menggunakan-two-factor-authentication-2fa.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
