# Remote SSH tanpa Password

> Tulisan ini adalah bagian dari [**Remote SSH**](https://verri.andriawan.web.id/series/ssh-remote-server) Series, sehingga untuk bisa membaca secara menyeluruh dan berkesinambungan, alangkah lebih baik bisa membaca secara urut dari link series [berikut](https://verri.andriawan.web.id/series/ssh-remote-server).

Me-remote device atau khususnya server biasa dilakuan oleh programmer untuk melakukan deploy aplikasi atau sekedar untuk mencopy file dari local device ke remote device. Protocol yang digunakan biasanya adalah SSH (Secure Shell) baik untuk mendapat akses shell dari target device atau untuk sekedar mengcopy file. biasa bisa menggunakan FTP (File Transfer Protocol) hanya saja untuk FTP tidak disarankan karena masalah keamanannya. Lebih disarankan menggunakan SFTP yang memanfaatkan protocol SSH untuk mentransfer data karena dinilai lebih aman.

Pada umumnya kita akan me-remote shell ke PC atau server menggunakan cara menjalankan command seperti ini `ssh verri@10.2.0.2`. Setelah itu terminal akan meminta kita untuk input password. Setelah kita menginput password, maka kita akan mendapatkan shell dari Remote Device. Tapi bagaimana jika kita ingin mengremote server tanpa password dan juga tanpa mengikutkan user account pada command ssh. Saya akan jelaskan caranya pada tulisan ini.

## Generate SSH Key Pairs Baru

Langkah pertama sebelum meng-config ssh yaitu kita perlu men-generate ssh key pairs dengan menggunakan `ssh-keygen`. Tapi sebelum itu lebih baik kita membuat direktori baru di folder `/home/user/.ssh`. Sebagai contoh disini saya menggunakan nama direktory `remote`.

```bash
$ mkdir ~/.ssh/remote
$ cd ~/.ssh/remote
$ ssh-keygen -t rsa -b 1024 -C verri@ndriawan

Generating public/private ed25519 key pair.
Enter file in which to save the key (/tmp/keys/id_ed25519):
```

Pada baris `Enter file blablbla`, kita diminta untuk menginputkan file path dimana key baru akan distore. Jika pada contoh output di atas, default path akan distore di `/tmp/keys` dengan nama file `id_ed25519`. Tapi karena kita sudah membuat folder baru `~/.ssh/remote` maka kita bisa inputkan lokasi file keys pada folder tersebut seperti ini `~/.ssh/remote/id_ed25519`. Lalu tekan Enter.

Berikut Informasi options dari command:

* **\-t** : Type key yang dipilih, secara default, type key akan memilih `RSA`. tapi pada contoh menggunakan `ed25519`.
    
* **\-b**: Panjang bits key, yang dimana pada contoh **1024**. Tapi options ini akan di-ignore atau tidak digunakan untuk type key ras, beda dengan **RSA** yang key lengthnya dinamic dan minimal secure bits-nya adalah 1024.
    
* **\-C**: adalah comment, saya menambahkan commit `verri@ndriawan` sebagi penanda bahwa key itu milik si pembuat key.
    

Selanjutnya akan muncul pada prompt meminta kita untuk meinputkan password. Kita bisa menginputkan password yang kita inginkan. Tapi password ini optional, jadi tidak menginputkan password pun tidak masalah untuk kepentingan yang tidak terlalu memerlukan keamanan. Kurang lebih output pada terminal akan seperti ini.

```tsx
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ~/.ssh/remote
Your public key has been saved in ~/.ssh/remote/id_ed25519.pub
The key fingerprint is:
SHA:blabla verri@ndriawan
The key's randomart image is:
+---[RSA 1024]----+
|  ..==o.         |
|=...             |
|o                |
+----[SHA256]-----+
```

Pada contoh key yang digenerate di atas, key akan menggunakan `id_ed25519`. Penamaan ini bebas. Pengguna bisa mengenerate key pairs dengan nama apa saja. Baiknya penamaan sesuaikan dengan kebutuhan saja.

Setelah generate selesai, maka seharusnya akan ada dua file yang terbuat, yaitu file `id_ed25519` dan file `id_`[`ed25519.pub`](http://ed25519.pub). Content dari file `id_`[`ed25519.pub`](http://ed25519.pub) inilah yang akan didistribusikan ke server nantinya.

## Alur koneksi SSH

Ketika membuka koneksi, SSH akan memastikan pada file `~/.ssh/config` apakah `destination` host ada di dalam config tersebut atau tidak. Jika tidak, maka ssh akan meminta kita sebagai commander untuk mengikutkan argument-argument pada command yang akan dieksekusi. tetapi jika config tersebut ada, maka ssh akan menggunakan config tersebut. Jika kita buka file `~/.ssh/config`, isi dari file tersebut kurang lebih ssh config pada sisi client akan terlihat seperti ini.

```bash
Host 10.2.0.2
  User root
  IdentityFile ~/.ssh/id_ed25519
```

Jika kita translate config tersebut ke dalam bentuk command, maka kurang lebih akan menjadi seperti ini.

```bash
$ ssh -i ~/.ssh/id_ed25519 root@10.2.0.2
```

Dimana option (-i) adalah identity file yang merupakan file `private key` yang digunakan untuk autentikasi. Seperti itulah alur pada sisi client.

Selanjutnya alur pada sisi server, ketika ada permintaan koneksi dari client dengan menggunakan protocol SSH seperti pada contoh sebelumnya, server akan melakukan verifikasi pair key yang ada pada file `~/.ssh/authorized_keys` berdasarkan identity file yang diikutkan pada command ssh. Jika pair key dari id tersebut terdaftar pada file `authorized_keys`, selanjutkan secara sederhananya server dan client akan saling mengautentikasi sehingga akhirnya client mendapatkan shell dari server.

## Distribusi Key

Setelah memahami cara autentikasi protocol SSH, maka selanjutnya yang perlu kita lakukan adalah mendistribusikan public key yang sudah dibuat sebelumnya ke server dengan menggunakan contoh command dibawah ini.

```bash
$ cat ~/.ssh/id_ed25519.pub | ssh root@10.2.0.2 "cat - >> /root/.ssh/authorized_keys"
```

lalu coba melakukan koneksi ke server menggunakan command ssh seperti ini

```bash
$ ssh -i ~/.ssh/id_ed25519 root@10.2.0.2
```

Jika berhasil, maka terminal dimana kita menjalankan command SSH tersebut akan mendapatkan shell dari server. Tapi jika gagal melakukan autentikasi, maka yang perlu dilakukan adalah coba merubah mode folder `~/.ssh` pada server ke permission `700` dan juga untuk file `~/.ssh/authorized_keys` pada server ubah ke mode `600`. sebagai contoh command seperti berikut

```bash
$ chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
```

Selanjutnya coba login ke remote server lagi menggunakan command ssh seperti sebelumnya.

## Kesimpulan

SSH adalah protocol aman yang digunakan untuk komunikasi antara dua node. SSH menggunakan berbagai algoritma enkripsi untuk mengauentikasi antar node. Selain menggunakan credential dari host untuk mengautentikasi antar node, SSH juga bisa menggunakan pair keys. Sehingga pengguna tidak perlu menginputkan password ketika mengauntentikasi dengan server. Dengan begitu, password akan tetap terjaga karena tidak akan sering ditransfer dari client ke server. Mengurangi resiko MITM atau keylogger.
