COVID Tracing Mongolia - Үндсэн backend service
Apache 2.0 лицензийн дагуу доорх нээлттэй эхийн төслүүд дээр үндэслэн хийв:
- https://github.com/cds-snc/covid-alert-app
- https://github.com/CovidShield/mobile
- https://github.com/CovidShield/server
Энэхүү репо нь Apple болон Google компаниудаас гаргасан Exposure Notification API технологийн дагуу хэрэглэгчдэд хэрэглүүлэх, React Native технологи дээр суурилсан гар утасны апп-н ард талд ажилладаг үндсэн backend сервис юм.
Хэрэглэгчийн хувь хүний мэдээллийн нууцлал, аюулгүй байдал болон найдвартай ажиллагааг хангах үүднээс маш сайн анхаарч зохион бүтээгдэж, бичигдсэн систем болно. Энэхүү систем нь Google, Apple-аас гаргасан Exposure Notification API технологийн журмын дагуу хувь хүнтэй холбоотой ямар ч мэдээллийг хадгалахгүй. Хэрэглэгчдийн хандаж буй Public IP хаягийн мэдээлэл л сервэр дээр ирэх бөгөөд энэ нь бусад аль ч интернэтийн орчинд байдаг нийтлэг зүйл билээ. Ямар ч мэдээлэл 21 хоногоос дээш хугацаанд хадгалагдахгүй.
Энэхүү баримтад::
- Ерөнхий
- Дата Хэрэглээ
- Нэг Удаагийн Код Гаргаж Авах
- Системийн Протоколын Талаар
- Deploy Хийх Талаар
- Системийн Тоо Баримт болон Шинжилгээ
- Энэ Төсөлд Хувь Нэмрээ Оруулах
- Энэ Системийг Хэн Хийсэн Бэ?
Overview
Apple/Google's Exposure Notification талаарх баримт бичиг нь энэ баримт бичгийг ойлгоход маш хэрэгтэй мэдээллүүд агуулсан байгаа тул эхлээд та Google, Apple аас гаргасан Exposure Notification API-н талаар уншсан байх хэрэгтэй гэдгийг анхааруулая. Тэгсэн тохиолдолд мэдээллийн нууцлал, технологийн ажиллагааны талаарх бүх дэлгэрэнгүй мэдээллийг авчихсан байна гэсэн үг юм.
Ерөнхийдөө бол 2 үндсэн ажиллагаанаас бүрдэнэ:
- Оношилгооны түлхүүр авах: Бусад хэрэглэгчдийн оношилгооны түлхүүрийн мэдээллийн жагсаалтыг авах; мөн
- Оношилгооны түлхүүр оруулах: Хэрэглэгчдийн утсан дээр ажилладаг (апп-аас гадуур) Exposure Notification технологи-д байрлаж буй оношилгооны түлхүүрийг сервис рүү апп аар дамжуулан оруулах.
Тиймээс энэ 2 чухал үйлдлийг тусад нь салгаж key-submission
болон key-retrieval
гэсэн 2 сервис болгон хөгжүүлсэн байгаа. Энэ 2 сервис нь тус тусдаа deploy хийгдэх боломжтой. Гагцхүү дундаа 1 үндсэн өгөгдлийн бааз-тай ажиллах ёстой.
Системийн кодчлолын талаар дэлгэрэнгүй мэдээлэл авахыг хүсвэл анхны нээлттэй эхийн төслийн зохион бүтээгч, хөгжүүлэгчдийн нэгийн танилцуулга видео-г дараах линкээр орж үзээрэй. Англи хэл дээр бий: https://www.youtube.com/watch?v=5GNJo1hEj5I.
Оношилгооны түлхүүр авах
Хэрэглэгчийн COVID шинжилгээ ЭЕРЭГ гарснаар тухайн хэрэглэгч нь албан ёсны, эрх бүхий байгууллагаас авсан кодыг гар утас дээр байгаа апп дотроо оруулж өгсөнөөр тухайн хэрэглэгчийн утсан дээр цугларсан, өмнөх 14 хоногийн оношилгооны түлхүүрүүд key-submission
сервис руу очино гэсэн үг. Энэ мэдээллийг сервис нь хүлээн авсан цаг хугацааны хамтаар тэмдэглэж, хадгалж авна. Олон түлхүүрээр дамжуулан хэрэглэгчийг таньж болох магадлалыг байхгүй болгохын тулд цаг хугацааны нарийвчлалыг хамгийн ойр байх цаг-т хамааруулна гэсэн үг.
Ойролцоо хугацаанд олон хэрэглэгчид оношилгдож, оношилгооны түлхүүрүүдээ сервисрүү явуулахаар бол цаг, цагаар нь бүлэглэн тухайн цагт ирсэн авсан бүх түлхүүрүүдийг нэг дор оруулна гэсэн үг. Ингэснээр ухаалаг утсан дээр ажиллаж буй апп нь цуварсан байдлаар ойрхон ойрхон, олон дахин шалгах шаардлагагүй болно гэсэн үг юм.
Олон хэрэглэгчдийн утсан дээр эдгээр оношилгооны түлхүүрүүд татагдах боломжтой учир найдвартай ажиллагаа үүднээс Content Distribution Network (CDN) ашиглавал зохистой. Түүний ард нь key-retrieval
сервис нь ажиллаж байна гэсэн үг.
Хавьталтын тохиргооны мэдээллийг авах
Хавьталтын тохиргооны мэдээлэл нь хавьталтын зэрэг, түүний эрсдлийн зэргийг тодорхойлоход чухал үүрэг гүйцэтгэдэг тохиргоо юм. Энэ мэдээллийг key-retrieval
сервисээр дамжуулан хэрэглэгчдийн утсан дээр байгаа апп татаж авна. Жишээ нь:
Өнгөрсөн 14 хоног дотор миний ямар нэг байдлаар ойртсон / хавьтсан хүн COVID шинжилгээ өгөөд ЭЕРЭГ гарсан байга гэж үзье. Тэгээд миний утсанд апп аар маань дамжуулаад анхааруулга иржээ. Тэгвэл би тэр хүнтэй хэр ойрхон байсан, хэдий хугацаанд ойрхон байсан зэрэг мэдээлэл дээр үндэслэн эрсдлийн зэргийг тодорхойлоход туслалцаа үзүүлдэг тохиргоо гэсэн үг юм.
$ curl https://KeyRetrievalServiceBackendDNS/exposure-configuration/exposure-notification.json
{"minimumRiskScore":0,"attenuationLevelValues":[1,2,3,4,5,6,7,8],"attenuationWeight":50,"daysSinceLastExposureLevelValues":[1,2,3,4,5,6,7,8],"daysSinceLastExposureWeight":50,"durationLevelValues":[1,2,3,4,5,6,7,8],"durationWeight":50,"transmissionRiskLevelValues":[1,2,3,4,5,6,7,8],"transmissionRiskWeight":50}
Оношилгооны түлхүүр оруулах
Хэрэглэгч COVID шинжилгээ өгөөд ЭЕРЭГ гарсан тохиолдолд албан ёсны, эрх бүхий байгууллага тухайн хэрэглэгчид Нэг Удаагийн Код гаргаж өгөх юм. Энэ кодыг тухайн байгууллагад зориулан гаргаж өгсөн вэбсайт-аар дамжуулан гаргаж авах юм. Энэ вэбсайт нь цаагуураа key-submission
гэсэн сервистэй харилцдаг гэсэн үг. Энэ Нэг Удаагийн Код-ыг авсан хэрэглэгч маань тэр кодоо гар утасныхаа апп дотор оруулна. Энэ код гаргаж байгаа гол шалтгаан нь хэрэглэгчид хуурамчаар "COVID туссан" гэж бусад хэрэглэгчдийг үймүүлж, сандаргасан, санаатай буруу, бусармаг үйлдэл хийж, олон нийтийн тайван байдал алдагдуулахаас сэргийлж өгч байгаа юм. Гар утасны апп болон key-submission
хоорондоо итгэлцэл тогтоосны дараа, энэ итгэлцэл нь 14 хоногийн туршид хадгалагдана. Өөрөөр хэлбэл хэрэглэгч 14 хоногтоо дахин Нэг Удаагийн Код оруулах шаардлагагүй болно гэсэн үг. Харин Нэг Удаагийн Код нь тэр дороо устаж үгүй болно.
Дээр дурьдсан итгэлцлээс үүссэн нууц түлхүүр нь цаашид 14 хоногийн туршид орж ирж буй Оношилгооны Түлхүүрүүдийг шалгах, шифрлэхэд хэрэглэгдэх бөгөөд 14 хоногийн дараа устгагдана. Шифрлэхэд хэрэглэж буй схем нь NaCl Box (Curve25519, XSals20, Poly1305). Маш өндөр зэрэглэлийн нууцлалынн алгоритм-д тооцогддог юм.
Дата Хэрэглээ
Энэхүү систем нь хэрэглэгчийн дата хэрэглээг маш сайн тооцоолж, хамгийн бага хэрэглээтэй байхаар бодолцож хийсэн. Үүнд:
- COVID эерэг оношилогдсон тохиолдол дээд тал нь 28 түлхүүр.
- Түлхүүрүүд 14 хоногийн турш хадгалагдана.
- Түлхүүр болгон 18 byte хэмжээтэй.
Жишээ нь 2020 оны 11 сарын 21-ний 17:00 цагийн мэдээллээр Монгол Улсад батлагдсан тохиолдол 4 өөр нэмэгдэж 582 болсон. Энэ 4 тохиолдол дээр: 4 x 28 * 18 = 1.9kB (өдөрт).
Нэг Удаагийн Код Гаргаж Авах
Албан ёсны, эрх бүхий байгууллагын ажилчид COVID Tracing - Mongolia гаргаж өгсөн вэбсайтаар дамжуулан Нэг Удаагийн Код гаргаж авах эрхийг олгодог. Энэхүү вэбсайтыг хэрэглэхийн тулд тухайн ажилчид бас бүртгэлтэй, нэвтрэх эрхтэй байна. Нэг Удаагийн Кодыг COVID эерэг гэсэн хариу авсан хүмүүст утсаар хэлж өгөх юм.
Энэ үйл ажиллагааг хариуцдаг сервис нь ˚key-submission
юм. Вэбсайт нь энэ сервистэй холбогдож ажилладаг. Вэбсайт гэхгүйгээр энгийн түвшин тест хийж, шалгаж үзэх бол:
curl -XPOST -H "Authorization: Bearer $token" "https://BackEndServerIPorDNS:PORT/new-key-claim"
Системийн Протоколын Талаар
2008 онд Google компаниад гаргасан protobuf ашигласан байгаа. Дэлгэрэнгүй мэдээлэл харахыг хүсвэл: "proto" лүү орж хараарай.
Deploy Хийх Талаар
-
key-submission
firewall-н ард deploy хийсэн байна гэж тооцоолж байгаа. Тэгж байж хэт их хүсэлт орж ирсэн тохиолдолд 400 болон 401 гэсэн хариулт буцааж хэрэглээг хязгаарлана (жишээ нь AWS WAF) -
key-retrieval
caching reverse proxy ард deploy хийсэн байна гэж тооцоолж байгаа.
Platforms
Системийн Тоо Баримт болон Шинжилгээ
Системийн талаар тоо баримт, шинжилгээнд хэрэгтэй мэдээллийг гаргаж авахын тулд OpenTelemetry технологийг хэрэглэхээр бодож хийсэн байгаа.
Тоо Баримт / Metrics
Metric-г дараах байдлаар гаргаж авч болно:
- standard output
- prometheus
Энэ тохиргоог асаахын тулд METRIC_PROVIDER
хувьсагчийг stdout
, pretty
, эсвэл prometheus
гэж тааруулж өгнө.
stdout
болон pretty
нь stdout
-руу мэдээллийг дамжуулдаг ч формат нь өөр, өөр байна. stdout
JSON форматтай (нэг мөрөнд) бол pretty
нь хүн уншиж болохуйц JSON форматтай (олон мөрөнд) байдаг юм.
хэрэглэхийг хүсч байвал доорх зааварчилгаатай танилцана уу.
Prometheus
Prometheus хэрэглэх хүсэлтэй бол өөрийнхөө сервэр дээр ажиллуулж байх хэрэгтэй.
Нэмэлтээр metric авах хэрэгтэй бол prometheus.yml
файл дотор target ууд нэмж болно:
...
static_configs:
- targets: ['localhost:9090', 'localhost:2222']
Tracing
Tracing хийх бол доорх тохиргоог хийж өгнө::
- standard output
TRACER_PROVIDER
=> stdout
эсвэл pretty
.
stdout
болон pretty
нь stdout
-руу мэдээллийг дамжуулдаг ч формат нь өөр, өөр байна. stdout
JSON форматтай (нэг мөрөнд) бол pretty
нь хүн уншиж болохуйц JSON форматтай (олон мөрөнд) байдаг юм.
Алдаанууд => stderr
.
Энэ Төсөлд Хувь Нэмрээ Оруулах
Энэ Системийг Хэн Хийсэн Бэ?
COVID Tracing Mongolia нь CovidShield гэсэн нээлттэй эхийн (Apache 2.0 License) төсөл дээр үндэслэн хийсэн төсөл юм. CovidShield төслийг Канада-д төвтэй Shopify компанийн сайн дурын инженерүүд зохион бүтээж, хөгжүүлсэн байдаг. COVID Tracing Mongolia-г Цар Тахалтай тэмцэж байгаа өнөө үед технологийн салбарт олон жил ажилласаны хувьд улсдаа чадах зүйлээрээ хувь нэмрээ оруулах үүднээс сайн дурын, Монгол мэргэжилтнүүд хөгжүүлсэн юм.
Холбоо барих хүсэлтэй бол: amarbayar.amarsanaa@gmail.com гэсэн хаягаар холбогдоорой.
License
Apache License 2.0
covid-tracing-mongolia/mobile is licensed under the Apache License 2.0. A permissive license whose main conditions require preservation of copyright and license notices. Contributors provide an express grant of patent rights. Licensed works, modifications, and larger works may be distributed under different terms and without source code.