Post

Matrix Protocol with Synapse and Element

Membangun platform komunikasi terenkripsi dan terdesentralisasi menggunakan protokol Matrix, menghadirkan server Synapse untuk infrastruktur yang aman dan klien Element sebagai antarmuka pengguna.

Matrix Protocol with Synapse and Element

Daftar Isi

Pendahuluan

Matrix adalah protokol komunikasi terbuka dan terdesentralisasi yang dirancang dengan fokus kuat pada privasi dan keamanan komunikasi real-time. Protokol ini memungkinkan interoperabilitas yang aman antara berbagai layanan pesan instan sambil mempertahankan kontrol data pengguna. Synapse adalah implementasi referensi server Homeserver Matrix yang ditulis dalam Python, menyediakan infrastruktur komunikasi yang terenkripsi secara end-to-end encryption (E2EE). Element adalah client web populer yang memberikan antarmuka pengguna aman untuk berinteraksi dengan jaringan Matrix, dengan implementasi kriptografi yang kuat untuk melindungi percakapan pengguna.

Arsitektur

Arsitektur Matrix terdiri dari tiga komponen utama: Client, Homeserver, dan Federation. Setiap pengguna (atau perangkat) berinteraksi dengan jaringan melalui sebuah Client yang terhubung ke sebuah Homeserver miliknya. Homeserver tersebut kemudian bertanggung jawab untuk menyinkronkan data pengguna dan, yang terpenting, berkomunikasi dengan Homeserver lain dalam jaringan yang terdesentralisasi. Model ini memastikan bahwa tidak ada satu pun otoritas pusat yang mengontrol seluruh jaringan, sambil tetap mempertahankan konsistensi data di seluruh Client.

Alur Komunikasi

Alur komunikasi antara dua pengguna (Client A dan Client B) pada Homeserver yang berbeda, seperti yang diilustrasikan dalam diagram berikut:

1
2
3
4
5
6
7
8
9
10
11
    { Matrix client A }                             { Matrix client B }
        ^          |                                    ^          |
        |  events  |  Client-Server API                 |  events  |
        |          V                                    |          V
    +------------------+                            +------------------+
    |                  |---------( HTTPS )--------->|                  |
    |   homeserver     |                            |   homeserver     |
    |                  |<--------( HTTPS )----------|                  |
    +------------------+      Server-Server API     +------------------+
                          History Synchronisation
                              (Federation)
  1. Pengiriman Events: Client A mengirim sebuah events (misalnya, pesan teks) ke Homeserver-nya melalui API Client-Server (HTTPS).
  2. Rute Federasi: Homeserver A, setelah menerima dan memvalidasi events dari Client A, mengidentifikasi bahwa events tersebut ditujukan untuk sebuah room yang juga melibatkan pengguna di Homeserver B.
  3. Komunikasi Server-ke-Server: Homeserver A kemudian meneruskan events tersebut secara langsung ke Homeserver B menggunakan API Server-Server melalui koneksi HTTPS yang aman.
  4. Distribusi ke Client: Homeserver B menerima events tersebut, memvalidasinya, dan kemudian mendistribusikannya ke semua Client yang terkait dengan Pengguna B (dalam hal ini, Client B) melalui koneksi Client-Server-nya.

Model Kepercayaan

Matrix mengadopsi model kepercayaan terdistribusi berbasis prinsip Trust-on-First-Use (TOFU) yang memungkinkan pengguna untuk memverifikasi perangkat melalui mekanisme pertukaran kode QR atau perbandingan emoji. Sistem ini memfasilitasi pembatalan verifikasi apabila suatu perangkat diduga mengalami kompromi keamanan, sekaligus memberikan perlindungan terhadap serangan man-in-the-middle melalui implementasi kriptografi asimetris. Selain itu, sistem secara proaktif menghasilkan peringatan kepada pengguna ketika terjadi perubahan pada kunci enkripsi, memungkinkan deteksi dini terhadap upaya penyadapan atau pencurian identitas.

Cara Kerja Synapse

Sebagai komponen inti infrastruktur Matrix, Synapse menerapkan serangkaian mekanisme keamanan multidimensi yang mencakup manajemen kriptografi, autentikasi, proteksi data, dan keamanan federasi. Dalam hal manajemen kriptografi, Synapse mengimplementasikan protokol Olm dan Megolm untuk enkripsi end-to-end, menyimpan kunci enkripsi dengan proteksi akses ketat melalui mekanisme isolasi proses, dan menerapkan prinsip forward secrecy dimana setiap pesan menggunakan kunci enkripsi unik yang mengalami rotasi secara berkala.

Pada lapisan autentikasi dan otorisasi, Synapse mendukung Multi-factor authentication untuk memperkuat proses verifikasi identitas pengguna, menerapkan manajemen token akses dengan masa berlaku terbatas dan mekanisme revocation yang responsif, serta mengimplementasikan Role-based access control (RBAC) yang membatasi hak akses berdasarkan hierarki peran pengguna yang terdefinisi dengan jelas.

Untuk aspek proteksi data, Synapse menerapkan isolasi data melalui segmentasi penyimpanan dimana data pengguna ditempatkan dalam database terenkripsi, menjalankan pembersihan data otomatis yang menghapus data media tidak diperlukan berdasarkan kebijakan retensi yang ditetapkan, dan menyediakan mekanisme backup terenkripsi dengan kunci yang dikelola terpisah dari sistem utama.

Pada level federasi, Synapse menjamin keamanan komunikasi antarserver melalui verifikasi sertifikat TLS mutual authentication untuk semua koneksi federasi, menerapkan penandatanganan digital (signed events) pada setiap events untuk menjamin integritas dan non-repudiation, serta mengintegrasikan mekanisme anti-spam yang mencakup deteksi pola anomalitas dan rate limiting berbasis reputasi server.

Prasyarat Sistem

  1. Sistem Operasi Linux (Debian/Ubuntu recommended), macOS, atau Windows dengan WSL2
  2. Hak akses root/sudo untuk instalasi paket dan konfigurasi sistem
  3. Docker yang terinstal dan berjalan dengan baik
    1
    2
    
    # Verifikasi instalasi Docker
    docker --version
    

Panduan Instalasi dan Konfigurasi Synapse Matrix Server dengan TLS

Generate Konfigurasi Awal

Langkah pertama dalam instalasi Synapse adalah menghasilkan file konfigurasi dasar. Docker volume digunakan untuk persistensi data:

1
2
3
4
5
docker run -it --rm \
  --mount type=volume,src=synapse-data,dst=/data \
  -e SYNAPSE_SERVER_NAME=192.168.100.185 \
  -e SYNAPSE_REPORT_STATS=no \
  matrixdotorg/synapse:latest generate

Penjelasan parameter:

  • --mount type=volume,src=synapse-data,dst=/data: Membuat volume Docker bernama synapse-data dan mount ke path /data dalam container
  • -e SYNAPSE_SERVER_NAME=192.168.100.185: Menetapkan nama server ke alamat IP lokal
  • -e SYNAPSE_REPORT_STATS=no: Menonaktifkan pelaporan statistik untuk privasi
  • matrixdotorg/synapse:latest: Image Docker resmi Synapse dari Docker Hub

Menjalankan Container Synapse Awal

Setelah konfigurasi dasar dihasilkan, jalankan container untuk pertama kali:

1
2
3
4
docker run -d --name synapse \
  --mount type=volume,src=synapse-data,dst=/data \
  -p 8008:8008 \
  matrixdotorg/synapse:latest

Perintah ini menjalankan container Synapse dalam mode detached, memetakan port 8008 host ke port 8008 container.

Generate Sertifikat TLS untuk IP Lokal

Untuk mengaktifkan TLS pada lingkungan pengembangan dengan IP lokal, buat sertifikat self-signed:

Buat direktori untuk menyimpan sertifikat

1
mkdir -p ~/synapse-ssl/certs && cd ~/synapse-ssl/certs

Generate private key (RSA 2048-bit)

1
openssl genrsa -out 192.168.100.185.key 2048

Generate Certificate Signing Request (CSR)

1
2
openssl req -new -key 192.168.100.185.key -out 192.168.100.185.csr \
  -subj "/CN=192.168.100.185"

Generate self-signed certificate dengan SAN (Subject Alternative Name)

1
2
3
openssl x509 -req -days 365 -in 192.168.100.185.csr \
  -signkey 192.168.100.185.key -out 192.168.100.185.crt \
  -extfile <(echo "subjectAltName=IP:192.168.100.185")

Sertifikat self-signed tidak akan dipercaya oleh klien secara default dan hanya cocok untuk pengembangan. Untuk produksi, gunakan sertifikat dari otoritas sertifikat terpercaya.

Modifikasi Konfigurasi Synapse

Akses shell container Synapse untuk mengedit file konfigurasi:

1
docker exec -it synapse bash

Di dalam container, instal editor teks dan edit file konfigurasi:

1
cd /data && apt update && apt install -y nano
1
nano homeserver.yaml

Temukan atau tambahkan bagian-bagian berikut dalam file homeserver.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server_name: "192.168.100.185"
public_baseurl: "https://192.168.100.185:8008/"

listeners:
  - port: 8008
    tls: true
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false
    # Bind ke semua interface termasuk IP lokal
    bind_addresses: ['0.0.0.0']

# Konfigurasi TLS
tls_certificate_path: "/data/192.168.100.185.crt"
tls_private_key_path: "/data/192.168.100.185.key"

# Nonaktifkan verifikasi sertifikat untuk federation (hanya untuk testing)
federation_verify_certificates: false

# Tetap bisa menerima koneksi HTTP dari localhost (opsional, untuk testing)
use_insecure_ssl_client_just_for_testing_do_not_use: true

Simpan perubahan dan keluar dari editor (untuk nano: Ctrl+X > Y > Enter).

Keluar dari sesi container dengan perintah:

1
exit

Menyalin Sertifikat dan Menjalankan Ulang Synapse

Hentikan dan hapus container Synapse yang ada:

1
docker stop synapse && docker rm synapse

Atur izin yang sesuai untuk file kunci privat:

1
chmod 644 ~/synapse-ssl/certs/192.168.100.185.key && chmod 644 ~/synapse-ssl/certs/192.168.100.185.crt

Salin sertifikat ke volume Docker:

1
2
docker run --rm -v synapse-data:/data -v ~/synapse-ssl/certs:/certs busybox \
  sh -c "cp /certs/192.168.100.185.crt /certs/192.168.100.185.key /data/ && chmod 644 /data/192.168.100.185.*"

Jalankan container Synapse dengan konfigurasi yang diperbarui:

1
2
3
4
5
6
docker run -d --name synapse \
  --mount type=volume,src=synapse-data,dst=/data \
  -p 8008:8008 \
  -p 8448:8448 \
  --user 991:991 \
  matrixdotorg/synapse:latest

Penjelasan parameter:

  • -p 8448:8448: Memetakan port federation Matrix
  • --user 991:991: Menjalankan Synapse dengan user ID yang aman (bukan root)

Verifikasi

Untuk memverifikasi bahwa Synapse berjalan dengan benar:

  1. Akses https://192.168.100.185:8008
    • Seharusnya menampilkan pesan default Synapse

    Synapse is running Synapse is running

  2. Periksa log container:
    1
    
    docker logs synapse
    
    • Log harus menunjukkan proses startup yang berhasil tanpa error kritis
  3. Periksa status container:
    1
    
    docker ps -f name=synapse
    
    • Container harus dalam status “Up”
    1
    2
    
    CONTAINER ID   IMAGE                         COMMAND       CREATED          STATUS                            PORTS                                                                                                NAMES
    7fbfd3b85216   matrixdotorg/synapse:latest   "/start.py"   15 minutes ago   Up 8 seconds (health: starting)   0.0.0.0:8008->8008/tcp, [::]:8008->8008/tcp, 0.0.0.0:8448->8448/tcp, [::]:8448->8448/tcp, 8009/tcp   synapse
    

Setelah container berjalan, verifikasi bahwa SSL berfungsi dengan benar:

Test koneksi SSL dengan curl

1
curl -vk https://192.168.100.185:8008

Konfigurasi dan Penggunaan Element

Opsi 1: Menggunakan Element Web (Rekomendasi)

  1. Buka https://app.element.io di browser
  2. Klik “Create Account”
  3. Klik “Edit” dan Masukkan URL homeserver: https://192.168.100.185:8008
  4. Masukkan kredensial dan klik “Register”

Log in to Element Log in to Element

Pesan kesalahan "Registration has been disabled on this homeserver" muncul ketika pengguna mencoba mendaftar melalui klien Matrix (seperti Element) yang terhubung ke instans Synapse dengan pendaftaran dinonaktifkan. Konfigurasi ini diatur dalam file homeserver.yaml melalui parameter enable_registration (Lihat Modifikasi Konfigurasi Synapse).

Opsi 2: Menggunakan Element Desktop

  1. Download dan install Element Desktop dari https://element.io/download
  2. Masukkan URL homeserver: https://192.168.100.185:8008

Mengaktifkan Pendaftaran Pengguna di Synapse

Modifikasi Konfigurasi Synapse

Langkah 1: Akses Container Synapse

Jika Synapse dijalankan dalam container Docker, gunakan perintah:

1
docker exec -it synapse bash

Perintah exec digunakan untuk menjalankan perintah di dalam container yang sedang berjalan. Opsi -it memberikan sesi interaktif dengan terminal.

Langkah 2: Edit File Konfigurasi

Edit file konfigurasi utama Synapse:

1
nano /data/homeserver.yaml

Gunakan editor teks seperti vim atau nano sesuai preferensi. Path /data/ adalah volume Docker yang umum digunakan untuk menyimpan data persisten.

Langkah 3: Modifikasi Parameter Pendaftaran

Temukan atau tambahkan parameter berikut dalam homeserver.yaml:

1
2
3
4
5
6
7
8
9
10
11
# Mengaktifkan pendaftaran pengguna melalui antarmuka web
enable_registration: true

# Izinkan pendaftaran tanpa verifikasi email (untuk lingkungan testing)
enable_registration_without_verification: true

# Opsional: Batasan pendaftaran (contoh: wajib memberikan email)
# registrations_require_3pid: ['email']

# Opsional: Mengharuskan token untuk pendaftaran (jika menggunakan pendaftaran undangan)
# registration_requires_token: false

Penjelasan Parameter:

  • enable_registration: Mengizinkan pengguna mendaftar secara mandiri.
  • enable_registration_without_verification: Melewati verifikasi email (tidak disarankan untuk produksi).
  • registrations_require_3pid: Memverifikasi identitas melalui email atau nomor telepon.
  • registration_requires_token: Membatasi pendaftaran hanya dengan token undangan.

Langkah 4: Simpan dan Keluar

Simpan perubahan dan keluar dari editor (untuk nano: Ctrl+X > Y > Enter).

Langkah 5: Keluar dari Container

Keluar dari sesi container dengan perintah:

1
exit

Langkah 6: Restart Container

Restart container untuk menerapkan perubahan:

1
docker restart synapse

Restart diperlukan untuk memuat ulang konfigurasi. Pastikan tidak ada interupsi layanan kritis selama proses restart.

Alternatif: Membuat Pengguna melalui Command-Line

Jika pendaftaran publik tidak diinginkan, gunakan skrip register_new_matrix_user yang disertakan dalam Synapse:

Membuat Akun Admin

1
2
3
4
docker exec -it synapse register_new_matrix_user \
  -c /data/homeserver.yaml \
  http://localhost:8008 \
  -u admin -p passwordadmin -a

Opsi -a memberikan hak administrator kepada pengguna.

Membuat Akun Pengguna Biasa

1
2
3
4
docker exec -it synapse register_new_matrix_user \
  -c /data/homeserver.yaml \
  http://localhost:8008 \
  -u user1 -p passworduser

Verifikasi Pendaftaran

Setelah mengaktifkan pendaftaran, uji melalui klien Matrix.

Untuk instans dengan sertifikat self-signed, browser mungkin memperingatkan risiko keamanan. Pastikan konfigurasi SSL sudah benar untuk produksi.

Troubleshooting

Masalah Umum dan Solusi

Koneksi TLS Gagal

Jika klien tidak dapat terhubung karena masalah sertifikat, verifikasi dengan openssl:

1
openssl s_client -connect 192.168.100.185:8008 -showcerts
  • Untuk pengembangan, tambahkan pengecualian sertifikat di browser
  • Untuk testing, gunakan flag --insecure pada curl
    1
    
    curl --insecure https://192.168.100.185:8008
    

Port Sudah Digunakan

Error "Address already in use" menunjukkan konflik port, periksa proses yang menggunakan port 8008 atau 8448:

1
sudo netstat -tulpn | grep :8008
  • Hentikan proses yang menggunakan port tersebut
  • Atau ubah port yang digunakan Synapse dalam konfigurasi

Container Tidak Berjalan

Periksa log container:

1
docker logs synapse

Jalankan container dalam mode interaktif untuk debugging:

1
2
3
4
docker run -it --rm --name synapse-debug \
  --mount type=volume,src=synapse-data,dst=/data \
  -p 8008:8008 \
  matrixdotorg/synapse:latest bash

Masalah Federation

Federation Matrix memerlukan konfigurasi DNS yang tepat untuk produksi. Untuk testing dengan IP lokal:

1
2
3
# Dalam homeserver.yaml
federation_domain_whitelist:
  - example.com  # Domain yang diizinkan untuk federation

Keamanan dan Pertimbangan untuk Produksi

Konfigurasi Keamanan

Hardening TLS

Untuk lingkungan produksi, selalu gunakan sertifikat dari otoritas terpercaya:

1
2
3
4
5
6
# Konfigurasi TLS yang aman
tls_certificate_path: "/path/to/fullchain.pem"
tls_private_key_path: "/path/to/privkey.pem"

# Hanya gunakan cipher yang aman
tls_cipher_suite: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"

Manajemen Pengguna

Nonaktifkan pendaftaran publik di lingkungan produksi:

1
2
enable_registration: false
registration_requires_token: true

Firewall dan Jaringan

Batasi akses ke port Synapse:

1
2
3
ufw allow 8008/tcp  # Client access
ufw allow 8448/tcp  # Federation
ufw deny 8008/udp   # Blok UDP yang tidak diperlukan

Backup dan Pemulihan

Backup Rutin

Backup volume Docker:

1
2
docker run --rm -v synapse-data:/source -v /backup:/backup busybox \
  tar czf /backup/synapse-backup-$(date +%Y%m%d).tar.gz -C /source ./

Backup Konfigurasi Database

Synapse menggunakan SQLite secara default (untuk instalasi kecil): Backup database:

1
sqlite3 /data/homeserver.db ".backup '/backup/homeserver.db.bak'"

Monitoring dan Logging

Aktifkan Logging Terstruktur

Dalam homeserver.yaml:

1
2
3
4
5
6
7
log_config: "/data/log.config"

# File log.config
version: 1
formatters:
  precise:
    format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'

Monitoring Kesehatan

Health check endpoint:

1
curl -f http://localhost:8008/health

Pertimbangan Kinerja

Konfigurasi Database

Untuk instalasi medium hingga besar, pertimbangkan migrasi ke PostgreSQL:

1
2
3
4
5
6
7
8
9
database:
  name: psycopg2
  args:
    user: synapse_user
    password: secure_password
    host: localhost
    database: synapse
    cp_min: 5
    cp_max: 10

Optimisasi Memori

Alokasi memori yang tepat:

1
2
rc_messages_per_second: 0.2
rc_message_burst_count: 10.0

Update dan Pemeliharaan

Strategi Update

  1. Selalu backup sebelum update
  2. Test update di lingkungan staging
  3. Ikuti release notes resmi
  4. Monitor performa pasca-update

Otomasi Update

1
2
3
4
5
# Script update sederhana
docker pull matrixdotorg/synapse:latest
docker stop synapse
docker rm synapse
# Jalankan container dengan konfigurasi baru

Considerations for Scale

Worker Configuration

Untuk instalasi besar, implementasikan workers:

1
2
3
4
5
6
7
instance_map:
  main:
    host: localhost
    port: 8034
  federation_sender:
    host: localhost
    port: 8035

Load Balancing

Gunakan reverse proxy seperti nginx atau Caddy. Contoh konfigurasi nginx:

1
2
3
4
5
6
7
8
9
10
11
12
upstream synapse {
    server localhost:8008;
}

server {
    listen 443 ssl;
    server_name matrix.example.com;
    
    location / {
        proxy_pass http://synapse;
    }
}

Pranala Menarik

Pranala Luar

This post is licensed under CC BY 4.0 by the author.