PBX virtual. Bagian 2: Selesaikan masalah keamanan dengan Asterisk dan atur panggilan



Pada artikel sebelumnya, kita melihat instalasi sederhana dari Asterisk 16 IP PBX dari repositori biasa di server virtual RuVDS dengan Ubuntu 20.04 . Dalam konfigurasi seperti itu, tidak ada gunanya memaparkan layanan VoIP kepada publik: Anda perlu membuat pengaturan tambahan yang terkait, antara lain, dengan keamanan informasi.



Mendefinisikan model ancaman



Untuk memulainya, mari kita cari tahu risiko apa yang akan dihadapi oleh perusahaan yang telah menempatkan PBX virtual di Internet. Semua keragaman mereka bermuara pada daftar singkat:



  • kebocoran data rahasia dan korupsi konten (pembajakan sesi);
  • akses tidak sah ke sistem informasi perusahaan karena kerentanan di Asterisk dan perangkat lunak lain di server, khususnya karena konfigurasi yang salah;
  • gangguan PBX virtual karena serangan penolakan layanan;
  • menjual kembali lalu lintas setelah meretas PBX (jenis serangan yang paling umum).


Beberapa kerentanan terkait langsung dengan perangkat lunak Asterisk. Pengembang IP PBX secara teratur merilis tambalan, dan administrator sistem hanya dapat menginstal pembaruan pada waktu yang tepat. Metode ini tidak menjamin keamanan lengkap, jadi perlu juga membatasi akses klien ke server telepon IP. Mari kita lihat apa yang perlu dilakukan untuk mengatur telepon yang aman.



Mengonfigurasi firewall



Cara termudah untuk melindungi diri Anda sendiri adalah dengan membatasi koneksi klien ke firewall. Karena VDS memiliki IP nyata, tidak perlu menyelesaikan masalah dengan lalu lintas yang melewati NAT. Tetap mengizinkan koneksi masuk dari pelanggan, dan memblokir semua lainnya melalui Netfilter . Pada server virtual RuVDS dengan Ubuntu, ini dikonfigurasi menggunakan utilitas UFW (Uncomplicated Firewall) yang sudah diinstal sebelumnya . Jika Anda belum menginstal paket ufw, mudah untuk memperbaikinya:



sudo apt-get install ufw


Pertama, mari kita periksa statusnya:



sudo ufw status verbose


Secara default, UFW dinonaktifkan (Status: tidak aktif), tetapi Anda tidak boleh terburu-buru mengaktifkannya: jika Anda tidak mengubah pengaturan, semua paket yang masuk akan mulai diretas di root dan Anda akan kehilangan akses ke server melalui SSH. Minimal, Anda harus mengizinkan koneksi masuk pada port 22, sementara Anda dapat menggunakan profil aplikasi OpenSSH yang sudah diinstal sebelumnya (lihat profil: daftar aplikasi sudo ufw):



#    SSH 
#   IP,   
sudo ufw allow OpenSSH
#    IP (  )
sudo ufw allow from XXX.XXX.XXX.XXX to any port 22
#       IP ()    Asterisk
sudo ufw allow from XXX.XXX.XXX.XXX
#   
sudo ufw enable


Untuk melihat kebijakan pemfilteran, gunakan perintah:



sudo ufw status verbose




Untuk menghapus aturan, Anda perlu melihat nomornya:



sudo ufw status numbered
sudo ufw delete N




Ada alat lain untuk mengkonfigurasi Netfiler (iptables yang sama), tetapi Anda tidak boleh menggabungkan utilitas yang berbeda - ini penuh dengan masalah. Anda tidak akan dapat melakukannya tanpa memfilter lalu lintas, karena Asterisk Anda tidak akan berdiri selama satu jam saat terbuka untuk semua angin, karena gambar lucu seperti itu akan muncul di konsol:





Karena pengguna jarak jauh berada di rumah (dalam teori), sebagai aturan, mereka memiliki IP khusus yang nyata, dan kami tidak memerlukan yang lain. Jika tidak, Anda harus berhati-hati dalam membuat jaringan pribadi virtual yang aman: ini juga akan berguna untuk mengakses sumber daya perusahaan lain yang tidak boleh diungkapkan ke publik. Pertahanan yang lebih canggih (fail2ban, dll.) Tidak terkait langsung dengan Asterisk. Kami akan melihatnya dalam konteks umum di posting lain juga.



Singkirkan modul yang tidak perlu



Bagian konfigurasi ini tidak terkait langsung dengan keamanan, tetapi umumnya diperlukan. Selain itu, semakin sedikit peluang yang diberikan PBX kepada klien, semakin sulit untuk meretasnya - tidak adanya fungsi yang tidak perlu sampai batas tertentu akan mempersulit kehidupan calon penyerang.



Fungsionalitas PBX minimum terlihat seperti ini:



  • Dukungan SIP;
  • Dukungan untuk codec G711 hanya alaw (jika diinginkan, Anda dapat menambahkan semua codec yang tersedia);
  • Rekaman panggilan;
  • Dukungan untuk format WAV (jika diinginkan, Anda dapat menambahkan dukungan untuk semua format yang tersedia);
  • Opsional : dukungan untuk menyimpan detail panggilan di server database.


Untuk mengelola layanan Asterisk secara interaktif, gunakan konsol teks bawaan:



sudo asterisk -rvv


File modul * .so disimpan di direktori / usr / lib / asterisk / modules / . Unggah dan unduh dapat dilakukan di konsol tanpa harus me-restart server (nama modul ditentukan tanpa ekstensi, misalnya, chan_sip sebagai gantinya chan_sip.so ): pengaturan Modul Asterisk ditemukan di file konfigurasi /etc/asterisk/modules.conf . Secara default, semua modul yang tersedia dimuat secara otomatis saat startup server, tetapi ini dapat dengan mudah diubah menggunakan parameter autoload = yes | no . Mari edit file konfigurasi, setelah membuat salinan cadangan dari file distribusi:



module load NAME

module unload NAME








sudo mv /etc/asterisk/modules.conf /etc/asterisk/modules.conf.b
sudo nano /etc/asterisk/modules.conf


Ada dua pendekatan untuk konfigurasi. Dalam kasus pertama, kami mengaktifkan pemuatan otomatis dari semua modul yang ada, dan menonaktifkan yang tidak perlu melalui modules.conf (bagian [modul] ): Harap dicatat bahwa di sini kami menentukan nama file dengan ekstensi. Opsi kedua adalah menonaktifkan pemuatan otomatis semua dan menentukan hanya modul yang diperlukan di bagian [modules] pada file modules.conf , misalnya, seperti ini: Setelah mengedit, ubah hak akses:



[modules]

autoload=yes

noload => module_name.so












[modules]

autoload = no

load => chan_sip.so

load => codec_alaw.so

load => format_wav.so

load => app_dial.so

load => res_musiconhold.so








sudo chown asterisk:asterisk /etc/asterisk/modules.conf
sudo chmod 640 /etc/asterisk/modules.conf




Kami melihat daftar modul yang dimuat di konsol Asterisk:



module show





Kami menambahkan modul lain sesuai selera. Ini adalah bagaimana file modules.conf akan mencari konfigurasi IP PBX dengan fungsionalitas yang cukup berkembang:



Isi dari modules.conf
[modules]



autoload=no ; /usr/lib/asterisk/modules/



; VoIP (SIP)

load => chan_sip.so

load => res_sorcery_config.so

load => res_pjproject.so ; res_rtp_asterisk.so

load => res_rtp_asterisk.so

load => app_dial.so ; res_musiconhold.so

load => app_echo.so

load => bridge_simple.so ;

load => app_bridgewait.so

load => app_transfer.so ;

load => app_verbose.so ;

load => app_voicemail.so ; res_adsi.so

load => app_playback.so ;

load => app_stack.so

load => app_confbridge.so ;

load => app_directory.so

load => res_adsi.so

load => app_system.so ;

load => app_queue.so ;



;

load => func_devstate.so

load => app_chanisavail.so ; ChanIsAvail

load => func_cut.so ; cut



;

load => res_musiconhold.so

load => pbx_config.so



;

load => codec_a_mu.so

load => codec_adpcm.so

load => codec_alaw.so

load => codec_ulaw.so

load => codec_gsm.so

load => codec_lpc10.so

load => codec_g726.so

load => codec_g722.so



;

load => format_gsm.so ; Raw GSM data

load => format_h263.so ; Raw h263 data

load => format_pcm.so ; Raw uLaw 8khz Audio support (PCM)

load => format_wav_gsm.so ; Microsoft WAV format (Proprietary GSM)

load => format_wav.so ; Microsoft WAV format (8000hz Signed Linear)

load => format_mp3.so ; mp3-format



; Dahdi ( VDS )

;load => chan_dahdi.so



;

load => res_parking.so



; res_monitor.so,

load => func_periodic_hook.so

load => func_strings.so ; STRFTIME

; CALLERID, res_monitor.so

load => func_callerid.so

load => func_volume.so

;

load => res_monitor.so

load => app_mixmonitor.so ; app_mixmonitor.so app_dial.so

load => func_channel.so



; MySQL ( )

;load => cdr_mysql.so

;load => res_config_mysql.so ; MySQL RealTime Configuration Driver



; MySQL ODBC ( )

;load => res_odbc.so

;load => res_config_odbc.so

;load => cdr_odbc.so ;



; SNMP ( )

;load => res_snmp.so



; /var/spool/asterisk/outgoing/ ( )

;load => pbx_spool.so



; ( )

;load => app_exec.so ; exec execif

;load => app_while.so ; dialplan

;load => res_sorcery_astdb.so

;load => res_sorcery_realtime.so

;load => app_read.so

;load => app_stack.so

;load => cdr_csv.so ; /var/log/asterisk/cdr-csv/Master.csv

;load => func_cdr.so

;load => func_logic.so

;load => func_timeout.so

;load => func_shell.so

;load => pbx_ael.so

;load => res_ael_share.so

;load => res_agi.so

;load => res_speech.so ; res_agi.so





Catatan: Anda dapat mengomentari baris menggunakan titik koma.



Setelah memodifikasi file modules.conf, Anda harus memuat ulang modul dari konsol Asterisk:



module reload



Jika Anda perlu memulai ulang Asterisk, gunakan perintah berikut sebagai ganti dari konsol bawaan:



sudo systemctl restart asterisk


Semua modul yang dipanggil harus diinstal, jika tidak Asterisk akan gagal saat mencoba memuatnya. Misalnya, untuk mendukung format MP3, Anda harus menginstal paket asterisk-mp3 , tetapi untuk bekerja dengan server MySQL secara langsung, Anda memerlukan asterisk-mysql :



sudo apt-get install asterisk-mp3
sudo apt-get install asterisk-mysql


Menemukan paket yang tersedia di repositori mudah menggunakan perintah:



apt-cache search asterisk


Faktanya, ada lebih banyak modul untuk Asterisk, kami belum mencantumkan semuanya. Jika, misalnya, Anda menginstal PBX pada server fisik dan ingin menghubungkan jalur analog melalui papan antarmuka telepon, Anda memerlukan paket asterisk-dahdi .



Mengonfigurasi VoIP



Sekarang mari kita ubah file sip.conf agar kita bisa bekerja dengan Asterisk:



sudo nano /etc/asterisk/sip.conf


Tambahkan baris berikut ke bagian [umum] , jika Anda belum melakukannya: Parameter pertama melindungi Asterisk dari serangan brute-force. Jika Anda tidak mengaktifkannya, server akan memberi tahu penyerang ketika pelanggan tidak ada. Setelah menemukan nomor yang valid, seorang peretas dapat membuka kata sandi brute force. Jika alwaysauthreject = yes , kesalahan otentikasi untuk pelanggan yang sudah ada dan yang tidak ada terlihat sama dan lebih sulit untuk menebak kata sandinya. Parameter allowguest = no melarang apa yang disebut. panggilan tamu ke pengguna PBX. Anda juga dapat mengubah port yang didengarkan Asterisk menjadi port non-standar menggunakan direktif bindport (demikian pula, alamat yang mendengarkan layanan VoIP dikonfigurasi menggunakan bindaddr ).



alwaysauthreject=yes

allowguest=no








Dalam file sip.conf kami telah mendaftarkan pelanggan (rekan - dari rekan bahasa Inggris) PBX. Jika pengguna bekerja dari IP tetap, ada baiknya membatasi konektivitasnya. Anda juga perlu membuat kata sandi yang kuat, memperkenalkan batas jumlah panggilan dan, tentu saja, mendaftarkan koneksi ke penyedia VoIP eksternal (yang disebut trunk - dari trunk bahasa Inggris):



deny=0.0.0.0/0.0.0.0 ;melarang koneksi dari semua node

permit=xxx.xxx.xxx.xxx/24 ;memungkinkan koneksi dari subnet

secret=_ ;pelanggan kata sandi tertentu harus tahan terhadap brute force

call-limit=2 ; membatasi jumlah panggilan simultan



Sebagai hasilnya, file sip.conf akan terlihat seperti ini:



Konten sip.conf
[general]

context=default

allowoverlap=no

udpbindaddr=0.0.0.0

tcpenable=no

tcpbindaddr=0.0.0.0

transport=udp

srvlookup=yes

alwaysauthreject=yes

allowguest=no



; SIPNET c chan_sip

; register

[sipnet]

remotesecret=

defaultuser=

host=sipnet.ru

type=peer

context=sipnet-trunk; dialplan ( extensions.conf)

insecure=invite

callbackextension=s

fromuser=

fromdomain=sipnet.ru

disallow=all

allow=alaw,ulaw

nat=no

directmedia=no

dtmfmode=rfc2833



[office](!)

; , .

; .

type=friend

host=dynamic ; , IP

nat=no ; NAT

deny=0.0.0.0/0.0.0.0 ;

call-limit=2

qualify=yes ; 2

dtmfmode=rfc2833 ; dtmf , rfc2833

; ,

disallow=all

allow=ulaw

allow=alaw

allow=g729

allow=g723

allow=g726

allow=h261

allow=h263

allow=h264

allow=h263p



; () office

[1001](office)

permit=XXX.XXX.XXX.XXX/Netmask

secret=_

callerid= <1001>

context=homeoffice ; dialplan ( extensions.conf)



[1002](office)

permit=YYY.YYY.YYY.YYY

secret=_

callerid= <1002>

context=homeoffice





Dalam hal ini, pelanggan 1001 dapat terhubung dari alamat manapun dari subnet tertentu, dan 1002 - hanya dari IP tetap. Kami juga memberikan pelanggan nomor, kata sandi, nama dan konteks, yang akan digunakan dalam rencana perutean panggilan (dialplan). Petunjuk untuk mengkonfigurasi trunk paling baik diambil di situs penyedia layanan: dalam kasus kami, ini adalah SIPNET . Parameternya mirip dengan rekan lainnya - ekstensi. Perhatikan juga bahwa konteks yang ditentukan dalam file konfigurasi (kita akan membicarakan entitas ini di bawah) harus ada dalam dialplan.



Setelah membuat perubahan pada file konfigurasi sip.conf , Anda perlu memulai ulang modul SIP melalui konsol Asterisk:



sip reload



Perintah konsol bawaan lainnya untuk bekerja dengan modul SIP:



sip show peers- menampilkan status semua trunk / peers;

sip show registry- tampilan semua registrasi;

sip show channels- tampilan saluran aktif;

sip show settings- melihat pengaturan global modul SIP.





Dialplan dan semuanya



Rencana perutean panggilan atau dialplan sering disebut sebagai inti dari Asterisk. Ini disimpan dalam file /etc/asterisk/extensions.conf dan pada dasarnya adalah skrip yang membuat PBX merespons kejadian eksternal. Skrip rencana panggilan dapat ditulis dalam berbagai bahasa, tetapi kami akan mempertimbangkan yang ada di dalamnya, yang muncul di versi pertama dari IP PBX populer. Setelah mengkonfigurasi dan memulai Asterisk, akan ada beberapa konten di file extensions.conf . Mari kita ganti dengan milik kita sendiri: Sintaks skripnya cukup mudah, kita akan membahas lebih detail di artikel berikutnya. Perhatikan bahwa Paket Panggilan Asterisk didasarkan pada empat konsep utama:



[general]

static=yes

writeprotect=no

priorityjumping=no

autofallthrough=yes

clearglobalvars=no



;

[default]

exten => _X.,1,NoOp()

same => n,Busy()

same => n,HangUp()



; homeoffice

[homeoffice]

;

exten => _1XXX,1,Dial(SIP/${EXTEN})

; SIPNET

exten => _.7XXXXXXXXXX,1,Dial(SIP/${EXTEN}@sipnet)



; sipnet-trunk, SIPNET

[sipnet-trunk]

;








  • Konteks - berkomunikasi bernama (nama diapit tanda kurung siku) bagian dari kode: set instruksi;
  • (extensions) β€” , exten;
  • β€” , ( ) ( n β€” next). exten same;
  • (applications) β€” . , Dial β€” , .


Ekstensi mengurutkan panggilan sesuai dengan topeng menggunakan serangkaian pola, dimulai dengan garis bawah - ini membuat PBX kita memahami bahwa kita sedang berbicara tentang pola:



exten => _1XXX,1,Dial(SIP/${EXTEN})



Selanjutnya, prioritas ditunjukkan dan panggilan ke aplikasi dengan meneruskan argumen ke sana cukup sederhana.



Mulai ulang dialplan menggunakan konsol Asterisk:



dialplan reload



Untuk melihat dialplan saat ini, gunakan perintah:



dialplan show







Perhatikan bahwa, misalnya, modul yang telah Anda muat dapat mengubah dialplan.



Sekarang PBX memungkinkan pelanggan internal untuk berkomunikasi satu sama lain, serta melakukan panggilan eksternal di Rusia melalui SIPNET. Tidak banyak, tapi cukup untuk pelajaran kedua. Dalam konfigurasi saat ini, modul chan_sip yang tidak digunakan lagi telah digunakan , yang pada akhirnya akan dihentikan di Asterisk. Pada artikel selanjutnya kita akan membahas migrasi ke perpustakaan PjSIPuntuk bekerja dengan tumpukan protokol VoIP, serta memperluas dialplan untuk menerima panggilan masuk, mengatur konferensi, dan menyelesaikan tugas perutean panggilan lainnya. Pembaca yang penuh perhatian mungkin telah memperhatikan bahwa beberapa modul yang dimuat tidak digunakan dalam contoh: kita akan membutuhkan mereka untuk mempelajari cara merekam panggilan, membuat antrian dan melakukan trik menarik lainnya.





Baca blog kami)










All Articles