Rediacci reeglid
Iga Rediacci repositoorium töötab isoleeritud keskkonnas oma Dockeri deemoni, krüpteeritud LUKS-mahu ja pühendatud IP-vahemikuga. Need reeglid tagavad, et teie rakendus töötab selles arhitektuuris õigesti.
Rediaccfile
- Igal repositooriumil peab olema Rediaccfile, bash-skript elutsükli funktsioonidega.
- Elutsükli funktsioonid:
up(),down(). Valikuline:info(). up()käivitab teie teenused.down()peatab need.info()pakub olekuteavet (konteineri olek, hiljutised logid, tervis).- Rediaccfile’i laeb renet, sellel on juurdepääs shelli muutujatele, mitte ainult keskkonna muutujatele.
Saadaolevad keskkonna muutujad Rediaccfile’is
| Muutuja | Näide | Kirjeldus |
|---|---|---|
REDIACC_WORKING_DIR | /mnt/rediacc/mounts/abc123/ | Ühendatud repositooriumi juuretee |
REDIACC_NETWORK_ID | 6336 | Võrgupõhise isoleerimise identifikaator |
REDIACC_REPOSITORY | abc123-... | Repositooriumi GUID |
{SVCNAME}_IP | HEARTBEAT_IP=127.0.24.195 | Teenusepõhine loopback-IP (teenuse nimi suurtähtedega) |
Minimaalne Rediaccfile
#!/bin/bash
_compose() {
renet compose -- "$@"
}
up() {
_compose up -d
}
down() {
_compose down
}
Compose
- Kasutage
renet compose, mittedocker compose, renet süstib võrgu isoleerimise, hosti võrgunduse, loopback-IP-d ja teenuse sildid. - Ärge määrake
network_mode-i oma compose-failis, renet sunnibnetwork_mode: host-i kõigile teenustele. Kõik teie määratud väärtused kirjutatakse üle. - Ärge määrake
rediacc.*-silte, renet süstib automaatseltrediacc.network_id,rediacc.service_ipjarediacc.service_name. ports:-kaardistused eiratakse hosti võrguühenduse režiimis. Lisagerediacc.service_port-silt HTTP-marsruutimiseks (teenused ilma selle sildita ei saa HTTP-marsruute). Kasutagerediacc.tcp_ports/rediacc.udp_ports-silte TCP/UDP-edasisuunamiseks.- Taaskäivituspoliitikad (
restart: always,on-failurejne) on ohutu kasutada, renet eemaldab need automaatselt CRIU ühilduvuse jaoks. Marsruuteri valvekoer taastab peatatud konteinerid automaatselt.rediacc.json-sse salvestatud algse poliitika alusel. - Ohtlikud seadistused on vaikimisi blokeeritud,
privileged: true,pid: host,ipc: hostja süsteemiteede hosti sidumiskohad lükatakse tagasi. Kasutagerenet compose --unsafe, et tühistada omal vastutusel.
Keskkonna muutujad konteinerite sees
Renet süstib need automaatselt igasse konteinerisse:
| Muutuja | Kirjeldus |
|---|---|
SERVICE_IP | Selle konteineri pühendatud loopback-IP |
REDIACC_NETWORK_ID | Võrgupõhise isoleerimise ID |
Teenuse nimetamine ja marsruutimine
- Compose’i teenuse nimi saab automaatse marsruudi URL-eesliiteks.
- Grand repositooriumid:
https://{service}.{repo}.{machine}.{baseDomain}(nthttps://myapp.marketing.server-1.example.com). - Fork-repositooriumid:
https://{service}-fork-{tag}.{repo}.{machine}.{baseDomain}(nthttps://myapp-fork-staging.marketing.server-1.example.com).-fork--eraldaja hoiab ära URL-kokkupõrked grand-repositooriumi teenuste nimedega. Forki URL kasutab alati vanema repositooriumi olemasolevat metamärgi sertifikaati, seega pole uut serti vaja. - Kohandatud domeenide jaoks kasutage Traefiku silte (kuid märkige: kohandatud domeenid EI sobi forkidega, domeen kuulub grand-repositooriumile).
Võrgundus
- Igal repositooriumil on oma Dockeri deemon aadressil
/var/run/rediacc/docker-<networkId>.sock. - Igal teenusel on unikaalne loopback-IP /26-alamvõrgus (nt
127.0.24.192/26). - Sidumine on automaatne: Teenused saavad siduda
0.0.0.0võilocalhostkülge - kernel kirjutab aadressi läbipaistvalt teenuse määratud loopback-IP-ga üle. Selgesõnaline${SERVICE_IP}sidumine töötab endiselt, kuid pole enam nõutav. - Tervisekontrollid võivad kasutada
localhost-i või${SERVICE_IP}-d. Näide:healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] - Repositooriumivahelised ühendused on kerneli poolt blokeeritud: Kernel blokeerib automaatselt ühendused loopback-IP-dega väljaspool repositooriumi
/26-alamvõrku. Teenus ühes repositooriumis ei saa jõuda teenusteni teises repositooriumis. Üks erand: fork’i ühendused vanema alamvõrku suunatakse läbipaistvalt fork’i enda teenustele (sama teenus, fork’i andmekoopia) ega jõua kunagi vanemani. Mitteseotud repositooriumid jäävad blokeerituks. - Teenustevaheline suhtlus: kasutage teenusenimesid (nt
db,redis); renet lisab iga teenusenime automaatselt hostinimena, mis lahendub õigeks IP-ks. Dockeri DNS-nimed host-režiimis EI tööta, kuid teenusenimed/etc/hostskaudu töötavad. Vältige${DB_IP}vms püsivatesse seadistusfailidesse kirjutamist (nt andmebaasi salvestatud ühendusstringid): fork suunab vahetult vanemalt päritud IP-d enda teenustele, kuid see ümbersuunamine katab vaid ühe põlvkonna; fork’i fork kannab endiselt vanavanema IP-sid, mis ei vii kuhugi. Teenusenimed lahenduvad igas repositooriumis alati õigesti. - Pordikonfliktid on võimatud repositooriumide vahel, igal on oma Dockeri deemon ja IP-vahemik.
- TCP/UDP pordi edasisuunamine: Lisage sildid mitte-HTTP-portide paljastamiseks:
labels: - "rediacc.tcp_ports=5432,3306" - "rediacc.udp_ports=53"
Salvestus
- Kõik Dockeri andmed salvestatakse krüpteeritud repositooriumi sisse, Dockeri
data-rootasub LUKS-mahus aadressil{mount}/.rediacc/docker/data. Nimetatud mahud, pildid ja konteineri kihid on kõik krüpteeritud, varundatud ja automaatselt forkitud. - Sidumiskohad
${REDIACC_WORKING_DIR}/...-sse on soovitatavad selguse huvides, kuid nimetatud mahud töötavad samuti turvaliselt.volumes: - ${REDIACC_WORKING_DIR}/data:/data # sidumine (soovitatav) - pgdata:/var/lib/postgresql/data # nimetatud maht (ka turvaline) - LUKS-maht on ühendatud aadressil
/mnt/rediacc/mounts/<guid>/. - BTRFS-hetktõmmised jäädvustavad kogu LUKS-taustafaili, sealhulgas kõik sidumiskoha andmed.
- Andmesalv on fikseeritud suurusega BTRFS-mahufail süsteemi kettal. Kasutage
rdc machine query --name <name> --system, et näha tegelikku vaba ruumi. Laiendage käsugardc datastore resize.
CRIU (reaalajas migratsioon)
- Kaasamine sildi kaudu: Lisage
rediacc.checkpoint=truekonteineritele, mida soovite kontrollpunkti seada. Konteinerid ilma selleta (andmebaasid, vahemälud) käivituvad värsked ja taastuvad oma mehhanismide kaudu (WAL, LDF, AOF). repo down --checkpointsalvestab protsessi oleku enne peatamist, järgminerepo uptaastab automaatselt. See on peamine sama-masina voog, mis on kinnitatud töötavana.backup push --checkpointjäädvustab töötava protsessi mälu + kettaoleku märgistatud konteinerite jaoks, seejärel edastab mahu teisele masinale. Taastage sihtmasinal käsugarepo up.repo fork --checkpointjäädvustab töötava vanema protsesside oleku ja CoW-kloonib checkpoint’i koos fork’iga. Fork’irepo uptaastab protsessid, samal ajal kui vanem samal masinal edasi töötab. Taastatud protsessid, mis viitavad vanema loopback-aadressidele (seotud soketid, mälus olevad teenuse IP-d), suunatakse läbipaistvalt fork’i enda aadressidele: nad suhtlevad alati fork’i andmekoopiaga, mitte kunagi vanema omaga.repo uptuvastab kontrollpunkti andmed automaatselt ja taastab, kui need leitakse. Kasutage--skip-checkpoint, et sundida värsket käivitamist.- Sõltuvusteadlik taastamine: Kasutab compose’i
depends_on, et käivitada andmebaasid esmalt (oodata tervena), seejärel CRIU-taastada rakenduse konteinerid. - TCP-ühendused muutuvad taastamisel aegunuks, rakendused peavad käsitlema
ECONNRESET-i ja uuesti ühenduma. CRIU ei säilita aktiivse TCP-ühenduse olekut taastamise üleselt üheski toetatud voos. - Dockeri eksperimentaalne režiim on lubatud automaatselt repositooriumipõhistel deemonitel.
- CRIU installitakse
rdc config machine setupkäigus. /etc/criu/runc.confon konfigureeritud vaikimisi koostcp-established-ga.- Konteineri turvapoliitikad süstitakse automaatselt märgistatud konteineritele,
renet composelisab järgmisedrediacc.checkpoint=true-ga konteineritele:cap_add:CHECKPOINT_RESTORE,SYS_PTRACE,NET_ADMIN(minimaalne komplekt CRIU jaoks kernelis 5.9+)security_opt:apparmor=unconfined(CRIU AppArmori tugi pole ülalvoolul veel stabiilne)userns_mode: host(CRIU nõuab init-nimeruum juurdepääsu/proc/pid/map_files-le)
- Konteinerid ilma sildita töötavad puhtama turvapoosiga (ilma lisavõimalusteta).
- Dockeri vaikimisi seccomp-profiil säilitatakse, CRIU kasutab
PTRACE_O_SUSPEND_SECCOMP(kernel 4.3+), et filtreid kontrollpunkti/taastamise ajal ajutiselt peatada. - Ärge määrake CRIU võimalusi käsitsi oma compose-failis, renet käsitseb seda sildi alusel.
- Vaadake heartbeat-malli CRIU-ühilduva viiterakenduse jaoks.
CRIU-ühilduvad rakenduse mustrid
- Käsitsege
ECONNRESET-i kõigil püsiühendustel (andmebaasibasseinid, veebipesad, sõnumijärjekorrad). - Kasutage ühendusbasseini teeke, mis toetavad automaatset taasühendamist.
- Lisage
process.on("uncaughtException")ohutusnet aegunud pesavigade jaoks sisemistest teegiobjektidest. - Taaskäivituspoliitikaid haldab renet automaatselt (eemaldatakse CRIU jaoks, valvekoer käsitseb taastamist).
- Vältige Dockeri DNS-ile toetumist, kasutage loopback-IP-sid teenuste vaheliseks suhtluseks.
Hosti turvapoliitikad OS-i kaupa
Kõigil viiel ametlikult toetatud serveri OS-il (vaadake Nõuded) kasutavad repositooriumipõhine dockeri deemon ja selle käitatavad konteinerid vaikimisi konteinersilte. rdc config machine setup ei installi kohandatud SELinuxi poliitikat ega AppArmori profiili. See on tahtlik: kompromiss seisneb selles, et konteineri protsessid töötavad hosti OS-i vaikimisi sildi poliitika all, mitte Rediacci-spetsiifilise pidamispoliitika all. Kui teie ohumudelis on vajalikud kohustusliku juurdepääsu kontrollid konteineri tasandil, konfigureerige need hosti tasandil enne juurutamist.
- Ubuntu 24.04 / openSUSE Leap 16.0: AppArmor on vaikimisi lubatud. Konteinerid töötavad vaikimisi docker-container profiili all. Ainus erand on CRIU (
apparmor=unconfinedrediacc.checkpoint=true-konteinerite jaoks, vastavalt ülaltoodud märkusele). - Fedora 43 / Oracle Linux 10: SELinux töötab vaikimisi jõustataval režiimil. Konteinerid saavad standardse
container_tkonteksti. Lisapoliitika installimine pole vajalik. Kui seadistamise samm ebaõnnestub AVC-keeldumistega, vaadake Tõrkeotsing – SELinuxi keeldumised. - Debian 13: AppArmor on saadaval, kuid ei jõustata vaikimisi kõigil domeenidel. Konteinerid kasutavad endiselt docker-container profiili.
Kokkuvõte: rdc ja renet tuvastavad käitatava OS-i automaatselt ja toodavad sama repositooriumipõhise isoleerimise kõigil viiel toetatud distributsioonil. OS-põhist turvaasendi lippu pole vaja.
Turvalisus
- LUKS-krüpteerimine on standardsete repositooriumide jaoks kohustuslik. Igal repositooriumil on oma krüpteerimisvõti.
- Mandaadid on salvestatud CLI konfiguratsioonis (
~/.config/rediacc/rediacc.json). Konfiguratsiooni kaotamine tähendab juurdepääsu kaotamist krüpteeritud mahtudele. - Ärge kunagi siduge mandaate versioonihaldusesse. Kasutage
env_file-i ja genereerige saladusedup()-is. - Repositooriumi isoleerimine: Iga repositooriumi Dockeri deemon, võrgustik ja salvestus on täielikult isoleeritud teistest repositooriumitest samal masinal.
- Agendi isoleerimine: AI-agendid töötavad vaikimisi ainult fork-režiimis. Igal repositooriumil on oma SSH-võti koos serveripoolse liivakastijõustamisega (
sandbox-gatewayForceCommand). Kõik ühendused on liivakastis Landlock LSM, OverlayFS kodu-ülekatte ja repositooriumipõhise TMPDIR-iga. Repositooriumiülene failisüsteemi juurdepääs on kerneli poolt blokeeritud. sudoon repositooriumi liivakastis disaini järgi keelatud. Landlock’i failisüsteemi isoleerimine nõuabNoNewPrivs, mis takistab igasugust privileegide tõstmist, seegasudoebaõnnestub teategano new privileges flag is set. Repositooriumi omaniku kasutajal on juba kõik vajalikud õigused kõige jaoks repositooriumi ühenduspunkti ja Dockeri pesa sees. Tõeliselt privilegeeritud toimingute jaoks (hosti pakettide installimine, kerneli häälestamine) käivitage need väljaspool liivakasti või Rediaccfile’iup()funktsioonist, mida täidab infrastruktuuritee.- Dockeri silla võrgundus on keelatud repositooriumipõhistel deemonitel. Iga repositooriumi
daemon.json(FlavorRediacc) sisaldab"bridge": "none"ja"iptables": false, seega tavalinedocker run <image>loob konteineri ainult loopback-liidesega ja ilma väljuva ühenduvuseta. See pole viga, see on see, kuidas repositooriumiülene isoleerimine jõustatakse: kerneli taseme eBPF-konksud, mis blokeerivad ühe repositooriumi jõudmise teise repositooriumi loopback-IP-deni, kehtivad ainult konteineritele, mis elavad hosti võrgu nimeruumis. Tootmisteenuste jaoks kasutagerenet compose, mis süstib automaatseltnetwork_mode: host. Ad-hoc ühekordsete konteinerite jaoks shellis edastage--network hostselgesõnaliselt. (Kasutajapõhised Hub-deemonid (FlavorHub, arenduskeskkonnad) on erandiks: need lubavadbridge="docker0"jaiptables=true, nii et kasutaja käivitatud konteinerid saavad tavalise väljuva võrguühenduse.)
Juurutamine
rdc repo upühendab LUKS-mahu automaatselt, kui see on lahti ühendatud, seejärel käivitab kõigi Rediaccfile’ideup()-i.rdc repo downkäivitabdown()ja peatab Dockeri deemoni.rdc repo down --unmountsulgeb ka LUKS-mahu (lukustab krüpteeritud salvestuse).- Forkid (
rdc repo fork) loovad CoW (kopeerimise-kirjutamisel) klooni uue GUID ja networkId-ga, konstantses ajas sõltumata repositooriumi suurusest. BTRFS-reflink dubleerib pildimetaandmed, mitte andmed, seega forkitakse 100 GB repositoorium sama mõne sekundiga kui 1 GB repositoorium. Fork jagab vanema krüpteerimisvõtit. - Ülevõtmine (
rdc repo takeover --name <fork> -m <machine>) asendab grand-repositooriumi andmed forki andmetega. Grand säilitab oma identiteedi (GUID, networkId, domeenid, autostart, varundusakel). Vanad tootmisandmed säilitatakse varukoopia forkina. Kasutage selleks: testige uuendust forkil, kontrollige, seejärel võtke tootmine üle. Pöörduge tagasi käsugardc repo takeover --name <backup-fork> -m <machine>. - Puhverserveri marsruudid muutuvad aktiivseks umbes 3 sekundit pärast juurutamist. Teade “Proxy is not running”
repo upajal on informatiivne ops/dev-keskkondades. rdc repo upjardc repo fork --uptrükivad URL-mustrirediacc.service_port-ga märgistatud teenuste jaoks juurutamise lõpus. Asendage{service}oma paljastatud teenuse nimega, et saada täpne URL. Teenused ilmarediacc.service_port-ita (andmebaasid, töötajad) ei saa marsruute ja neid ei kuvata.
Levinud vead
docker composekasutaminerenet composeasemel - konteinerid ei saa võrgu isoleerimist.- Taaskäivituspoliitikad on ohutud, renet eemaldab need automaatselt ja valvekoer käsitseb taastamist.
privileged: truekasutamine - pole vajalik, renet süstib spetsiifilised CRIU võimalused.- Toorte IP-de hardkodeerimine püsivatesse konfiguratsioonifailidesse - kasutage ühenduste jaoks teenuste nimesid, et hoida forki isoleerimine puutumata.
rdc term connect -ckasutamine lahendusena ebaõnnestunud käskude jaoks - teatage vigadest.repo deleteteeb täieliku puhastuse, sealhulgas loopback-IP-d ja systemd-üksused. Käivitagerdc machine prune --name <name>, et puhastada pärand-kustutamiste järelejäänud.