Setelah menyiapkan server OpenVPN Anda sendiri, Anda mungkin ingin meningkatkan keamanannya. Salah satu cara untuk melakukannya dan merampingkan proses autentikasi Anda adalah dengan menggunakan Single Sign-in atau Single Sign-On (SSO), terkadang juga disebut sebagai SAML (Ini adalah protokol SSO). Ini menambahkan langkah keamanan lain untuk mencegah pengguna yang tidak diinginkan terhubung ke server Anda sementara pada saat yang sama berintegrasi dengan pengguna yang ada, sistem manajemen identitas atau klien, atau proses otentikasi.
Panduan ini memberikan contoh bagaimana ini dapat bekerja dengan Okta, platform identitas berbasis cloud yang populer. Dasar-dasar contoh ini diterjemahkan ke sebagian besar Sistem Manajemen Identitas (IDMS) hanya dengan perubahan pada cara Anda berkomunikasi dengan IDMS pilihan Anda.
Harap perhatikan contoh ini dirancang untuk menunjukkan dasar-dasar bagaimana sistem IDM atau SSO dapat berintegrasi dengan OpenVPN di sisi server, tidak dirancang untuk digunakan sendiri apa adanya.
Persiapan
Untuk panduan ini, kami berasumsi:
- Anda memiliki akun Okta (panduan ini akan berfungsi dengan uji coba gratis Okta)
- Anda telah menginstal versi terbaru Ubuntu (20,04 pada saat penulisan)
- Anda memiliki root akses ke instalasi ini
- Anda memiliki akses publik ke Sistem ini pada port 80 dan 443 untuk akses HTTP &HTTPS, dan NAMA-A DNS menunjuk ke sana (misalnya, openvpnsso.server.com)
- Anda sudah memiliki salinan Viskositas yang terinstal di perangkat klien Anda dan sudah menyiapkan untuk server ini
Dokumentasi untuk Okta dapat ditemukan di https://help.okta.com/en/prod/Content/index.htm
Contoh Okta lebih lanjut dapat ditemukan di halaman GitHub mereka di https://github.com/okta
Panduan ini hanya boleh digunakan sebagai contoh untuk menyiapkan SSO di server Anda. Situs web Python Flask yang disediakan dirancang sebagai contoh saja dan tidak dimaksudkan untuk penggunaan produksi.
Jika Anda memulai dari awal dengan penginstalan Ubuntu 20.04 yang baru, proses dari sini hingga selesai hanya akan memakan waktu sekitar 20 menit.
Pengaturan Okta
Pertama, kita perlu mengonfigurasi Okta untuk situs web baru yang akan menangani komunikasi antara OpenVPN dan Okta.
- Masuk ke Okta di akun admin Anda
- Di sebelah kiri perluas menu, dan buka Aplikasi> Aplikasi
- Klik Buat Integrasi Aplikasi
- Pilih ODIC - OpenID Connect , lalu Aplikasi Web dan klik Berikutnya
- Berikan nama integrasi Aplikasi your Anda nama yang akan Anda kenal seperti 'Server OpenVPN Saya'
- Pastikan Kode Otorisasi adalah satu-satunya opsi yang dicentang di bawah 'Klien yang bertindak atas nama pengguna' di bawah 'Jenis hibah'
- Mengganti '
' sebagai berikut, setel URI pengalihan masuk Anda ke http://<yourserver.com>/authorization-code/callback
- Secara opsional, ganti lagi '
' sebagai berikut, setel URI pengalihan keluar Anda ke http://<yourserver.com>/logout
- Setel Akses terkontrol sesuai pilihan Anda, untuk tujuan pengujian jika ini adalah akun uji coba, cukup pilih Izinkan semua orang di organisasi Anda mengakses
- Klik Simpan
Setelah disimpan, halaman akan dimuat ulang. Tetap buka halaman ini, atau catat sekarang ID Klien , Rahasia klien , dan domain Okta , kita akan membutuhkan ini nanti.
Penyiapan Server
Selanjutnya, kita perlu mengatur server. Singkatnya, kita membutuhkan server OpenVPN yang siap digunakan, untuk menginstal nginx sebagai proxy untuk aplikasi Python Flask, membuat beberapa perubahan firewall kecil, menginstal sertifikat SSL, mengkonfigurasi aplikasi flask dan membuat beberapa perubahan kecil pada OpenVPN.
Persiapan Server
Pertama, login ke server Anda melalui SSH atau buka Terminal, dan jalankan perintah berikut untuk memastikan semuanya mutakhir
sudo apt-get update
sudo apt-get -y upgrade
Pengaturan Server OpenVPN
Pertama, kita membutuhkan Server OpenVPN yang siap digunakan. Jika Anda belum memilikinya di server ini, ikuti panduan Menyiapkan server OpenVPN dengan Ubuntu dan Viscosity.
Setelah penyiapan, pastikan Anda dapat terhubung.
Selanjutnya, kita perlu menambahkan beberapa baris ke konfigurasi OpenVPN Server:
- Edit konfigurasi
sudo nano /etc/openvpn/server.conf
- Di akhir file, tambahkan berikut ini:
management 127.0.0.1 50123 auth-user-pass-optional management-client-auth
- Tekan Ctrl+X, untuk keluar, Y untuk menyimpan, lalu Enter untuk mengonfirmasi jalur
- Mulai ulang server dengan
sudo systemctl restart [email protected]
Jika Anda mencoba menyambung sekarang, sambungan pada akhirnya akan gagal dengan pesan otentikasi gagal.
Catatan:
Jika Anda memiliki server yang sudah ada yang memiliki skrip atau plugin autentikasi, ini harus dihapus karena SSO akan menggantikannya. Okta dapat dikonfigurasi dengan opsi 2FA meskipun kami tidak akan membahasnya dalam panduan ini, lihat dokumentasi Okta.
Pengaturan Server Web
Firewall
Jika Anda mengikuti panduan Menyiapkan server OpenVPN dengan Ubuntu dan Viscosity, pertama-tama kita perlu membuka firewall untuk mengizinkan lalu lintas HTTP &HTTPS, jalankan yang berikut:
-
sudo ufw allow http
-
sudo ufw allow https
-
sudo ufw reload
Instal ningx
Selanjutnya kita perlu menginstal nginx. nginx adalah HTTP dan server proxy terbalik yang akan melayani komponen aplikasi web kami dan memungkinkan penggunaan fitur seperti TLS/SSL. Lakukan hal berikut di Server Ubuntu Anda:
- Jalankan
sudo apt-get -y install nginx
- Edit
sudo nano /etc/nginx/sites-enabled/default
- Gulir ke bawah ke baris
server_name _;
, dan ganti garis bawah (_) dengan nama DNS server Anda, misalnya myserver.com, sehingga menjadi seperti ini -server_name myserver.com;
- Tekan Ctrl+X, untuk keluar, Y untuk menyimpan, lalu Enter untuk mengonfirmasi jalur
- Muat ulang nginx dengan
sudo nginx -s reload
Setup Let's Encrypt
Jika Anda sudah memiliki sertifikat SSL untuk bagian ini, Anda dapat melompat ke bagian berikutnya. Jika tidak, Let's Encrypt dan Certbot mempermudah mendapatkan sertifikat SSL.
- Jalankan
sudo apt-get install -y certbot python3-certbot-nginx
- Jalankan yang berikut ini, ganti myserver.com dengan FQDN Anda, dan ikuti petunjuknya
sudo certbot --nginx -d myserver.com
. Anda dapat menentukan domain tambahan jika Anda memerlukannya, misalnyasudo certbot --nginx -d myserver.com -d www.myserver.com -d sso.myserver.com
. - Mungkin perlu beberapa menit bagi certbot untuk merespons setelah menjawab perintah
- Setelah selesai, certbot dapat memperbarui sertifikat Anda secara otomatis, cukup tambahkan cronjob untuk menjalankan
/usr/bin/certbot renew --quiet
sekali sehari.
Siapkan nginx
Sekarang Anda memiliki sertifikat SSL, kami dapat menyelesaikan penyiapan nginx.
- Edit
sudo nano /etc/nginx/sites-enabled/default
- Hapus bagian berikut:
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
- Gulir ke bawah setelah baris
# managed by Certbot
, tetapi sebelum}
, dan rekatkan berikut ini:
real_ip_header X-Real-IP; real_ip_recursive on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; location / { try_files $uri @proxy; } location @proxy { proxy_pass http://127.0.0.1:8080; proxy_pass_header Server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass_header Server; proxy_connect_timeout 3s; proxy_read_timeout 10s; }
- Tekan Ctrl+X, untuk keluar, Y untuk menyimpan, lalu Enter untuk mengonfirmasi jalur
- Muat ulang nginx dengan
sudo nginx -s reload
Pemasangan Aplikasi Web
Sekarang kita dapat menginstal aplikasi web dan memulainya. Kami akan membuat pengguna untuk menjalankan aplikasi web karena ini menciptakan sedikit lebih banyak keamanan. Jalankan yang berikut ini:
-
sudo apt-get install -y python3-pip
Instal python pip agar kita dapat menginstal dependensi Flask -
sudo adduser --system --no-create-home --group ssoappuser
Buat pengguna untuk menjalankan aplikasi web sebagai -
cd /home
-
sudo mkdir ssoapp
-
sudo chown ssoappuser:ssoappuser ssoapp
-
cd ssoapp
-
sudo git clone https://github.com/thesparklabs/openvpn-okta-sso-example.git
Unduh aplikasi web dari GitHub -
cd openvpn-okta-sso-example
-
sudo python3 -m pip install -r requirements.txt
Instal dependensi untuk aplikasi web -
sudo cp ssoapp.service /lib/systemd/system/ssoapp.service
Instal file layanan -
sudo chown root:root /lib/systemd/system/ssoapp.service
-
sudo systemctl daemon-reload
Penyiapan Aplikasi Web
Terakhir, kita hanya perlu beberapa pekerjaan penyiapan cepat agar aplikasi web berfungsi dan berbicara dengan Okta. Di sinilah Anda memerlukan ID Klien , Rahasia klien , dan domain Okta kami berkumpul menyiapkan Okta sebelumnya.
- Buat salinan template rahasia dengan
sudo cp client_secrets.json.dist client_secrets.json
- Buat rahasia acak dengan kode berikut dan salin
openssl rand -hex 20
- Edit konfigurasi dengan
sudo nano client_secrets.json
- Ganti {{THIS_IS_A_SECRET}} dengan string acak yang kami buat dua langkah lalu
- Ganti {{OKTA_DOMAIN}} di auth_uri, penerbit, token_uri, dan userinfo_uri dengan domain Okta Anda
- Ganti {{CLIENT_ID}} dengan ID Klien . Anda
- Ganti {{CLIENT_SECRET]] dengan rahasia Klien . Anda
- Ganti {{DOMAIN_ANDA}} dengan alamat server Anda, mis. server saya.com
- Tekan Ctrl+X, untuk keluar, Y untuk menyimpan, lalu Enter untuk mengonfirmasi jalur
- Muat ulang nginx dengan
sudo nginx -s reload
Kami sekarang dapat mengaktifkan dan memulai layanan aplikasi dengan
- Aktifkan layanan untuk memulai saat sistem melakukan
sudo systemctl enable ssoapp
- Mulai layanan
sudo systemctl start ssoapp
Penyiapan Klien
Jika Anda telah mengikuti panduan ini dengan menyertakan penggunaan kami Menyiapkan server OpenVPN dengan Ubuntu dan panduan Viskositas, tidak ada yang perlu Anda lakukan, cukup sambungkan dengan Viskositas.
Jika Anda telah memodifikasi server yang ada, satu-satunya perubahan yang perlu Anda lakukan adalah mematikan otentikasi pengguna/kata sandi jika aktif. Untuk melakukan ini, edit koneksi, buka Otentikasi dan hapus centang "Otentikasi Nama Pengguna/Kata Sandi", Simpan koneksi dan sambungkan.
Token Auth
OpenVPN auth-gen-token
Contoh aplikasi menyertakan dukungan untuk auth-gen-token. Karena kami tidak menggunakan nama pengguna/kata sandi melalui OpenVPN, ini perlu ditangani melalui antarmuka manajemen. Untuk mengaktifkannya, cukup tambahkan auth-gen-token 0 external-auth
ke konfigurasi server Anda.
Penyegaran Token Okta
Contoh di atas dapat diperluas untuk menggunakan token Okta alih-alih token autentikasi OpenVPN untuk autentikasi ulang. Kami tidak akan memberikan contohnya karena dukungan bawaan OpenVPN akan mencakup sebagian besar pengaturan.
Namun, jika Anda ingin menggunakan Okta, berikut adalah hal utama yang perlu diingat:
- Anda perlu memodifikasi balasan fungsi clientAllow untuk mendorong auth-token Anda.
- Anda perlu memodifikasi fungsi clientReauth untuk mengambil kata sandi dari lingkungan klien yang diteruskan melalui antarmuka manajemen, ikuti dokumentasi Oktas untuk menyegarkan token ini, lalu kirim balasan autentikasi klien yang serupa dengan clientAllow termasuk token yang diperbarui.
- Anda perlu memodifikasi konfigurasi server dan klien untuk memastikan bahwa reneg-sec kurang dari masa berlaku token Okta