Raspberry Pi

Raspberry Pi IoT Cihazını Güvenli Hale Getirme: Pratik Bir Sağlamlaştırma Kontrol Listesi

Raspberry Pi IoT cihazları için hesapları, SSH anahtarlarını, güvenlik duvarı kurallarını, güncellemeleri, systemd sandbox'ını, gizli bilgileri ve TLS ile şifrelenmiş MQTT bağlantılarını kapsayan uygulamalı bir sağlamlaştırma kontrol listesi.

Raspberry pi iot güvenliğini sağlamayı anlatan, şifreli bir MQTT bağlantısıyla asma kilit ve güvenlik duvarı kalkanı arkasındaki Raspberry Pi
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Bir Raspberry Pi IoT cihazını güvenli hale getirmek için saldırganların aradığı kolay kapıları kapatmanız gerekir: parola ile girişler, açık portlar, güncel olmayan paketler, root olarak çalışan servisler ve şifrelenmemiş trafik. Bu kontrol listesi, Raspberry Pi OS Bookworm için tam komutlarla her katmanı ele alıyor ve hiç gelen port gerektirmeyen, TLS ile şifrelenmiş bir MQTT bağlantısıyla bitiyor. Listeyi bir kez uygulayın, ardından sonucu imajınıza işleyin; böylece her yeni cihaz sağlamlaştırılmış olarak başlar.

Sahadaki Bir Pi için Tehdit Modeli

Bir Pi gateway'i, tam olarak kontrol etmediğiniz bir yerde duran küçük bir Linux sunucusudur: bir müşterinin ağı, bir fabrika sahası, bir yol kenarı kabini. Gerçekçi tehditler egzotik değildir. Otomatik tarayıcılar SSH üzerinden varsayılan ve zayıf parolaları dener. Yama yapılmamış servisler bilinen açıklarla istismar edilir. Root olarak çalışan ele geçirilmiş bir uygulama tüm cihazı ele geçirir. Bir script'te bırakılan kimlik bilgileri bir Git deposunda veya bir destek talebinde son bulur. Şifrelenmemiş MQTT trafiği paylaşılan bir ağda okunur veya değiştirilir. Fiziksel erişimi olan biri SD kartı çıkarıp okur.

Aşağıdaki kontrol listesindeki her madde bunlardan birini hedefler. Hiçbiri özel donanım gerektirmez.

Bir Bakışta Kontrol Listesi

# Alan Eylem Neye karşı korur
1 Hesaplar Benzersiz kullanıcı, güçlü parola, bilinen kimlik bilgilerine sahip ortak imaj yok Varsayılan kimlik bilgisi saldırıları
2 SSH Yalnızca anahtar, root girişi yok, isteğe bağlı port kısıtlaması Parola kaba kuvvet saldırıları
3 Güvenlik duvarı Varsayılan olarak gelen trafiği reddet, SSH'ye yalnızca yönetim ağlarından izin ver Açıkta kalan servisler
4 Güncellemeler Gözetimsiz güvenlik güncellemeleri, düzenli tam yükseltmeler Bilinen açıklar
5 Servisler Kullanmadıklarınızı devre dışı bırakın Gereksiz saldırı yüzeyi
6 En az yetki Özel servis kullanıcısı, systemd sandbox Yetki yükseltme
7 Gizli bilgiler Kimlik bilgileri kodda değil, root'a ait bir ortam dosyasında Kimlik bilgisi sızıntıları
8 MQTT 8883 portunda TLS, cihaz başına benzersiz kimlik bilgileri Dinleme, kimlik taklidi
9 İzleme Girişler, başarısız kimlik doğrulama, MQTT üzerinden sağlık Fark edilmeyen ele geçirme
10 Fiziksel Muhafaza, devre dışı bırakılmış kullanılmayan arayüzler, depolama önlemleri Kurcalama

1. Hesaplar

Güncel Raspberry Pi OS imajları artık eski varsayılan pi kullanıcısı ve parolasıyla gelmiyor; kullanıcıyı Raspberry Pi Imager'da veya ilk açılışta oluşturursunuz. Tahmin edilmesi zor bir kullanıcı adı ve uzun bir parola seçin ve her cihazın aynı kimlik bilgilerini paylaştığı bir altın imajı asla dağıtmayın. Bir filo için imaj oluşturuyorsanız, kurulum (provisioning) sırasında cihaz başına kimlik bilgileri üretin.

# hangi hesapların giriş yapabildiğini kontrol et
grep -vE "nologin|false" /etc/passwd
# yalnızca anahtar kullanması gereken hesapların parolasını kilitle
sudo passwd -l someuser

2. Yalnızca Anahtarla SSH

Açık anahtarınızı Pi'ye kopyalayın, onunla giriş yapabildiğinizi doğrulayın, ardından paket güncellemelerinin değişikliğinizin üzerine yazmaması için bir drop-in dosyasıyla parola kimlik doğrulamasını devre dışı bırakın.

# iş istasyonunuzda
ssh-keygen -t ed25519 -C "admin@workstation"
ssh-copy-id admin@gateway-01.local

# Pi üzerinde
sudo tee /etc/ssh/sshd_config.d/10-hardening.conf > /dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
MaxAuthTries 3
EOF
sudo sshd -t && sudo systemctl reload ssh

Mevcut oturumunuzu açık tutun ve kapatmadan önce ikinci bir terminalde yeni bir girişi test edin. Sahaya kurulan cihazlarda SSH'ye hiç ihtiyacınız yoksa sudo systemctl disable --now ssh ile devre dışı bırakın ve onu geçici olarak etkinleştiren bir bakım prosedürü kullanın.

3. Güvenlik Duvarı

Bir MQTT gateway'i yalnızca giden bağlantılar kurar; bu yüzden neredeyse hiç gelen kurala ihtiyaç duymaz. ufw yapılandırmayı okunabilir tutar:

sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 192.168.10.0/24 to any port 22 proto tcp   # yalnızca yönetim alt ağı
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status verbose

Alt ağı kendi yönetim ağınızla değiştirin. Daha sıkı ortamlarda giden trafiği de reddedin ve yalnızca DNS, NTP, paket aynaları ve 8883 portundaki MQTT broker'ınıza izin verin. SSH'nin daha geniş ağlardan erişilebilir olması gerekiyorsa fail2ban ekleyin.

4. Güncellemeler

Gerçek dünyadaki ele geçirmelerin çoğu zaten düzeltmesi bulunan açıkları istismar eder. Otomatik güvenlik güncellemelerini etkinleştirin ve düzenli tam yükseltmeler planlayın:

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
sudo unattended-upgrade --dry-run --debug | tail -n 20

Python bağımlılıklarınızı da bu rutine dahil edin. Sürümleri bir requirements.txt içinde sabitleyin, yükseltmeleri önce bir cihazda test edin, ardından filoya yayın.

5. Kullanılmayan Servisleri Devre Dışı Bırakın

Çalışan her servis yama yapılacak ve saldırılacak bir şeydir. Neyin etkin olduğunu listeleyin ve gateway'inizin ihtiyaç duymadıklarını kapatın:

systemctl list-unit-files --state=enabled --type=service
sudo systemctl disable --now avahi-daemon cups 2>/dev/null
sudo systemctl disable --now bluetooth   # yalnızca BLE kullanmıyorsanız

Ekransız cihazlarda, cihaz yalnızca Ethernet kullanıyorsa Wi-Fi veya Bluetooth'u config.txt içinde dtoverlay=disable-wifi veya dtoverlay=disable-bt ile donanım seviyesinde de devre dışı bırakabilirsiniz.

6. Uygulamanız için En Az Yetki

MQTT istemcisini giriş kabuğu olmayan ve yalnızca ihtiyaç duyduğu gruplara (örneğin gpio veya dialout) sahip özel bir sistem kullanıcısı olarak çalıştırın. Ardından systemd'nin onu bir sandbox'a almasına izin verin:

sudo useradd --system --home /opt/gateway --shell /usr/sbin/nologin gateway
sudo usermod -aG gpio gateway
[Service]
User=gateway
Group=gateway
EnvironmentFile=/etc/gateway/mqtt.env
ExecStart=/opt/gateway/.venv/bin/python -u /opt/gateway/gateway.py
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ReadWritePaths=/var/lib/gateway
ProtectKernelTunables=yes
ProtectControlGroups=yes
RestrictSUIDSGID=yes

ProtectSystem=strict, listelediğiniz yollar dışında tüm dosya sistemini servis için salt okunur yapar; böylece ele geçirilmiş bir script sistem dosyalarını değiştiremez veya kalıcılık yerleştiremez. Başka hangi seçeneklerin uygulanabileceğini görmek için systemd-analyze security gateway.service komutunu çalıştırın. Yeniden başlatma politikaları dahil eksiksiz unit dosyası Python MQTT script'ini açılışta çalıştırma yazısındadır.

7. Gizli Bilgileri Kodun Dışında Tutun

Broker kimlik bilgilerini yalnızca root tarafından okunabilen bir ortam dosyasında saklayın (systemd, yetkileri düşürmeden önce dosyayı okur):

sudo mkdir -p /etc/gateway
sudo tee /etc/gateway/mqtt.env > /dev/null <<'EOF'
MQTT_HOST=broker.connectmq.com
MQTT_PORT=8883
MQTT_USERNAME=YOUR_USERNAME
MQTT_PASSWORD=YOUR_PASSWORD
MQTT_CLIENT_ID=YOUR_CLIENT_ID
EOF
sudo chmod 600 /etc/gateway/mqtt.env

Dosyayı sürüm kontrolünün ve paylaştığınız her imajın dışında tutun. Bir cihaz kaybolur veya kullanımdan kaldırılırsa kimlik bilgilerini broker tarafında iptal edin.

8. MQTT Bağlantısını Güvenli Hale Getirin

1883 portundaki düz MQTT, kimlik bilgilerini ve verileri açık metin olarak gönderir. 8883 portunda TLS kullanın. ConnectMQ broker'ları, Pi'nin sistem CA paketi sayesinde zaten güvendiği bir Let's Encrypt sertifikası sunar; bu yüzden sertifika dosyası gerekmez:

import os
import paho.mqtt.client as mqtt

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=os.environ["MQTT_CLIENT_ID"])
client.username_pw_set(os.environ["MQTT_USERNAME"], os.environ["MQTT_PASSWORD"])
client.tls_set()                       # sunucu sertifikasını ve hostname'i doğrular
client.connect(os.environ["MQTT_HOST"], int(os.environ["MQTT_PORT"]), keepalive=60)
client.loop_forever()

Üretimde asla tls_insecure_set(True) çağırmayın; hostname kontrolünü devre dışı bırakır ve amacı boşa çıkarır. Saatin doğru olduğundan emin olun; çünkü Pi yanlış bir tarihle açılırsa ve NTP henüz senkronize olmadıysa sertifika doğrulaması başarısız olur. Her cihaz için benzersiz kimlik bilgileri kullanın: ConnectMQ üzerinde client ID'ler verilen kimlik bilgilerine bağlıdır ve bir adresten tekrarlanan başarısız girişler IP engellemesine yol açar. Python MQTT TLS rehberi sertifika seçeneklerini daha derinlemesine ele alır; MQTT güvenliği en iyi uygulamaları ise broker tarafını inceler. Cihaz yalnızca dışarıya bağlandığı için 3. adımdaki güvenlik duvarı kapalı kalır.

Genel MQTT test broker'ının herkes tarafından okunabildiğini unutmayın. Yalnızca test içindir; üretim cihazlarının yeri özel bir broker'dır.

9. İzleme

Sağlamlaştırılmış bir cihaz da göz kulak olunmayı gerektirir. Beklenmedik girişler için journalctl -u ssh çıktısını inceleyin, sağlık ve güvenlik olaylarını (başarısız SSH denemeleri, servis yeniden başlatmaları, beklenmedik yeniden açılışlar) bir MQTT topic'ine yayınlayın ve anormalliklerde alarm üretin. Retained bir Last Will durum topic'i, bir cihaz çevrim dışı olduğunda size hemen haber verir; bu da kurcalamanın ilk işareti olabilir.

10. Fiziksel Güvenlik

Biri depolama birimini çıkarabiliyorsa, kimlik bilgileri dahil üzerindeki her şeyi okuyabilir. Kilitlenebilir bir muhafaza kullanın, Compute Module tabanlı cihazlarda dahili depolamadan açmayı düşünün, donanımınızın izin verdiği yerlerde kullanılmayan USB ve HDMI'ı devre dışı bırakın ve kontrolünüzden çıkmış her cihazı yeniden imaj yüklenene kadar güvenilmez kabul edin. Raspberry Pi dokümantasyonu ilgili yapılandırma seçeneklerini açıklar.

Bu adımlar Raspberry Pi güvenilirlik ipuçlarıyla iyi bir ikili oluşturur ve birlikte Raspberry Pi MQTT rehberinden yola çıkılarak kurulan her gateway için temel çizgiyi oluşturur.

ConnectMQ ile Güvenle Bağlanın

Sağlamlaştırılmış bir cihaz, üretim için tasarlanmış bir broker'ı hak eder. ConnectMQ; 8883 portunda TLS, 8084 portunda güvenli WebSocket, cihaz başına kimlik bilgileri ve flood koruması sunan bir yönetilen MQTT broker'dır. Kredi kartı gerekmeden app.connectmq.com adresinde ücretsiz bir Serverless broker oluşturun ve sağlamlaştırılmış ilk Pi'nizi dakikalar içinde TLS üzerinden bağlayın.

Sık Sorulan Sorular

Raspberry Pi'de MQTT için herhangi bir port açmam gerekir mi?

Hayır. Bir MQTT istemcisi broker'a dışarıya doğru bağlanır; bu yüzden Pi'nin MQTT için gelen porta ihtiyacı yoktur. Gelen SSH'ye, eğer gerekiyorsa, yalnızca güvenilir yönetim ağlarından izin verin.

1883 portu hiç kabul edilebilir mi?

Yalnızca hassas olmayan verilerle yerel testler için. Güvenilmeyen bir ağdan geçen her şey, kimlik bilgilerinin ve payload'ların şifrelenmesi için 8883 portunda TLS kullanmalıdır.

Her cihazın kendi MQTT kimlik bilgileri olmalı mı?

Evet. Benzersiz kimlik bilgileri, filonun geri kalanına dokunmadan kaybolan veya ele geçirilen tek bir cihazı iptal etmenizi sağlar ve logları anlamlı kılar.

Disk şifreleme Raspberry Pi'de işe yarar mı?

Depolama birimi çalınırsa verileri korur, ancak bu durumda cihazın açılışta yanında bir kişi olmadan kilidi açabilmesi gerekir; bunu bir Pi'de güvenli şekilde yapmak zordur. Çoğu gateway için saklanan gizli bilgileri en aza indirmek ve iptal edilebilir kimlik bilgileri kullanmak daha pratiktir.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.