Login OpenVPN ke REST API

Jadi ceritanya si client sudah ada website dan ingin supaya user dari website tersebut bisa login dan konek OpenVPN.

Masalah pertama yang saya hadapi adalah password usernya di encrypt, dan kemudian hosting yang digunakan tidak support remote database (padahal maunya pasang radius). Dan saya pun agak males kalo perlu ngedit aplikasi dia.

Setelah membaca dokumentasi OpenVPN akhirnya saya mendapat pencerahan yaitu dengan cara meng-login-kan usernya melalui REST API websitenya. Jadi ketika login, si OpenVPN dengan script khusus akan mencoba login ke website melalui REST API, jika didapat respon maka user dianggap valid dan bisa konek.

Konfigurasi

Saya asumsikan OpenVPN server sudah terinstall, bisa konek dan hanya perlu penambahan otentikasi.

Pada artikel ini saya menggunakan script php, dan perlu membuat 2 buah file, yaitu:

  • auth.php : script yang bertugas melakukan login via rest api website dan memvalidasi user id
  • auth.sh : script yang akan di eksekusi oleh OpenVPN

bila anda mengikuti keseluruhan artikel ini, pastikan pada server sudah terinstall package php-cli

Tahap pertama adalah mempersiapkan script untuk melakukan login via REST API website nya, script pada contoh ini saya buat menggunakan bahasa PHP. Menggunakan shell script saja sebenarnya bisa, tapi karena saya perlu fungsi json_decode maka dari shell script nanti akan memanggil script PHP ini.

File saya letakkan pada /etc/openvpn/server/script/auth.php, isinya kurang lebih seperti dibawah ini:

<?php

/**
 * Define Login URL
 */
$api_url = 'https://your-website/api/v1/login';

/**
 * Header Add your own Header for Logging
 */
$headers = [
    'Accept: application/json',
    'User-Agent: PHP-CURL, OpenVPN'
];

/**
 * Params from openvpn scripts
 */
$username = $argv[1];
$password = $argv[2];

// CURL 
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('username' => $username, 'password' => $password)));

// Receive Server Response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$user_id = "";
try {
    $server_output = curl_exec($ch);
    $json = json_decode( $server_output );
    $user_id = $json->data->id;
    echo $user_id;
} catch( \Exception $e ) {
    // Do Error Handling Here
}

curl_close ($ch);

Kemudian buat file yang akan di eksekusi oleh OpenVPN, file saya letakkan di /etc/openvpn/server/script/auth.sh. File tersebut akan memanggil script PHP yang dibuat sebelumnya, user akan dianggap valid bila script php tadi mereturn user_id . Script PHP tersebut sebenarnya dapat diganti dengan bahasa apapun yang kalian mau.

Isi dari file auth.sh kurang lebih seperti dibawah ini:

#!/bin/bash
user_id=`php /etc/openvpn/server/script/auth.php $username $password`

## Check user
[ "$user_id" != '' ] && echo "user : $username" && echo 'authentication ok.' && exit 0 || echo "authentication failed. $username"; exit 1

Setelah semua script selesai dibuat, tambahkan baris dibawah ini pada konfigurasi OpenVPN server. File konfigurasi biasanya berada di /etc/openvpn/server/server.conf

username-as-common-name
auth-user-pass-verify /etc/openvpn/server/script/auth.sh via-env
script-security 3

kemudian restart OpenVPN

systemctl restart openvpn

atau

/etc/init.d/openvpn restart

Cobalah konek dan pantau log nya untuk memastikan tidak ada kesalahan.

Kadek Jayak
Seorang Web Developer di Denpasar Bali. Nulis blog hanya sekedar iseng dan berbagi pengalaman.
%d blogger menyukai ini: