/backend-server

Primary LanguageGoApache License 2.0Apache-2.0

COVID Tracing Mongolia - Үндсэн backend service

Apache 2.0 лицензийн дагуу доорх нээлттэй эхийн төслүүд дээр үндэслэн хийв:

  1. https://github.com/cds-snc/covid-alert-app
  2. https://github.com/CovidShield/mobile
  3. https://github.com/CovidShield/server

Энэхүү репо нь Apple болон Google компаниудаас гаргасан Exposure Notification API технологийн дагуу хэрэглэгчдэд хэрэглүүлэх, React Native технологи дээр суурилсан гар утасны апп-н ард талд ажилладаг үндсэн backend сервис юм.

Хэрэглэгчийн хувь хүний мэдээллийн нууцлал, аюулгүй байдал болон найдвартай ажиллагааг хангах үүднээс маш сайн анхаарч зохион бүтээгдэж, бичигдсэн систем болно. Энэхүү систем нь Google, Apple-аас гаргасан Exposure Notification API технологийн журмын дагуу хувь хүнтэй холбоотой ямар ч мэдээллийг хадгалахгүй. Хэрэглэгчдийн хандаж буй Public IP хаягийн мэдээлэл л сервэр дээр ирэх бөгөөд энэ нь бусад аль ч интернэтийн орчинд байдаг нийтлэг зүйл билээ. Ямар ч мэдээлэл 21 хоногоос дээш хугацаанд хадгалагдахгүй.

Энэхүү баримтад::

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

Amazon AWS

Kubernetes

Системийн Тоо Баримт болон Шинжилгээ

Системийн талаар тоо баримт, шинжилгээнд хэрэгтэй мэдээллийг гаргаж авахын тулд 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.