Monday, March 11, 2013

Нийтийн түлхүүрт дэд бүтэц


Өмнөх жишээн дээр дурьдсан шифрлэлтийг компьютерийн шинжлэх ухаанд хэрхэн ашигладаг талаар жишээ болгож үзье.
1-р жишээ: Нууцлал шаарлагатай вэб хуудас болон хэрэглэгчийн компьютер хоёрын хооронд мэдээллийг хэрхэн шифрлэж явуулдаг вэ.
www.facebook.com хаягийг жишээ болгоод авч үзье.
  1. Хэрэглэгч компьютер дээрээ вэб хөтөч (browser) прорграмын хаягийн талбарт (address bar) www.facebook.com гэж бичнэ. 
  2. Вэб хөтөч домэйн нэрийг ялгах (DNS) серверт хандан www.facebook.com ажиллаж байгаа серверийн IP хаягийг олж авах бөгөөд уг серверт хандах хүсэлтээ илгээнэ. 
  3. Хариуд нь www.facebook.com вэб сервер өөрийн нийтийн түлхүүрийг вэб хөтчөөр өгч явуулна. 
  4. Вэб хөтчийн авчирсан нийтийн түлхүүрээр хэрэглэгчийн компьютер симетрик түлхүүрээ шифрлээд www.facebook.com вэб серверт буцааж илгээнэ. 
  5. www.facebook.com шифрлэгдсэн мэдээллийг хүлээж аваад өөрийн хувийн түлхүүрээр задалж уншина. 
  6. Задалсан мэдээлэл нь симетрик түлхүүр байх бөгөөд энэхүү түлхүүрээр шифрлээд www.facebook.com вэб хуудсыг өгч явуулна.
https протоколын ажиллах зарчим

Хэрэглэгчийн вэб хөтөч дээр www.facebook.com гарч ирэх бөгөөд хэрэглэгч өөрийн нэвтрэх нэр нууц үгээ оруулна. Энэхүү оруулсан мэдээлэл нь www.facebook.com серверийг хүртэл шифрлэгдэх буюу дундаас нь хэн нэгэн этгээд тайлж унших боломжгүй байх юм.
Мэдээж хэрэг энэ бол зөвхөн хялбаршуулсан жишээ бөгөөд үүний цаана олон нарийн процессууд бий. Эдгээр нарийн процессийн нэг бол дундын сертификат олгогч буюу CA (Certificate Authority) юм.
Төсөөлдөө жишээ нь хэрэглэгчийн вэб хөтөч www.facebook.com –ийн нийтийн түлхүүрийг авчрах ёстой байтал дундаас нь хэн нэгэн өөрийнхөө нийтийн түлхүүрийг явуулчихвал яах вэ. Компьютер үүнийг ялгаж танихгүй учир симетрик түлхүүрээ уг “хуурамч” нийтийн түлхүүрээр шифрлээд явуулна. Харин дундаас нь халдагч этгээд www.facebook.com –ийн дүр эсгэн өнөөх шифрлэсэн мэдээллийг хүлээж аваад өөрийнхөө хувийн түлхүүрээр тайлж уншаад хэрэглэгчийн симетрик түлхүүрийг гартаа оруулчихна. Хэрэглэгч өөрийгөө найдвартайгаар www.facebook.com –д нэвтэрсэн гэж ойлгож байгаа боловч бүх мэдээллийг дундын этгээд өөрийнхөө түлхүүрээр тайлж уншаад сууна гэсэн үг. 
Дундын этгээд (Man in the Middle) вэб хөтчийг мунхруулах боломжтой

Үүнээс сэргийлэхийн тулд дундын гуравдагч этгээд гарч ирэх шаардлагатай болно. Энэ нөхрийг сертификат олгогч/баталгаажуулагч (CA) гэж нэрлэе.  СА –ийн хийх үндсэн үүрэг бол www.facebook.com –ийг шалгаж үзээд үнэхээр ард нь Марк Цукерберг байгаа эсэхийг нягталсаны эцэст www.facebook.com –д хувийн болон нийтийн түлхүүрийг олгоно (Өөр олон янзын хувилбараар ажиллаж болно. Хялбаршуулах үүднээс ингэж тавилаа). Уг түлхүүртээ СА өөрийнхөө цахим гарын үсэг буюу digital signature –ийг зоож өгнө.
www.facebook.com уг хос түлхүүрийг хүлээж авч өөрийнхөө вэб сервер дээр байршуулах бөгөөд үүний үр дүнд хэрэглэгчийн вэб хөтөч www.facebook.com –д хандаж өөрт нь өгч буй нийтийн түлхүүрийг шалгаж үзнэ. Бүх хүлээн зөвшөөрөгдсөн СА –ийн дижитал гарын үсэг ихэнх вэб хөтөч програмуудад дотоод мэдээлэл байдлаар агуулагдаж байдаг. Вэб хөтөч уг нийтийн түлхүүр дээрхи СА –ийн цахим гарын үсгийг өөрийнхөө дотоод сантай харьцуулж үзээд мөн бол итгэж www.facebook.com –ийн нийтийн түлхүүрийг компьютертээ авчирж өгнө.
Нийтийн түлхүүрт дэд бүтцийн үндсэн ажиллагаа

Хэрэв энэ бүх шифрлэлт байхгүй байсан бол юу болох байсан бэ гэвэл сүлжээний хаа нэгтэйгээс хэн дуртай нь sniffer буюу шиншлэгч програм ажиллуулж www.facebook.com хэрэглэгч хоёрын солилцож буй мэдээлэл (хэрэглэгчийн нэр, нууц үг гм) –ийг олж авах боломжтой. Манай жишээн дээрхи www.facebook.com –ийн хэрэглэгчийн нэр, нууц үг алдлаа гэхэд шууд утгаараа бодит хохирол учрах нь бага байх. Харин банкны системд нэвтэрч орж банкны мэдээллээ оруулах гэж буй бол тухайн банк хэрэглэгч хоёрын хооронд тогтож буй холболтыг хэн нэгэн дундаас нь шиншлээгүй баталгаатай холболт мөн эсэхийг шалгаж үзэхэд гэмгүй.
Wireshark програмын тусламжтайгаар хялбархан гэгч нь сүлжээгээр дамжиж буй мэдээллийг шиншлэх боломжтой

Банкны мэдээлэл оруулдаг нууцлал шаардах вэб хуудсанд хувийн мэдээллээ оруулж буй бол вэб хөтчийнхөө хаягийн талбарын өмнө гарч ирж буй сертификатны мэдээллийг харчихад зүгээр. 
www.facebook.com -ийг Верисайн компаниас баталгаажуулсан сертификат

Дээрхи зурган дээрхи сертификат нь Верисайн компаниас олгосон сертификат бөгөөд таныг www.facebook.com руу холбогдлоо гэдгийг Верисайн компани баталж дижитал нотариат болж өгч байна гэсэн үг. 
Сертификатыг таних аргагүй байгаа нөхцөлд вэб хөтчийн өгдөг алдаа
Зарим тохиолдолд вэб хөтөч тухайн сайтны аюулгүй байдлын сертификатан дээрхи гарын үсгийг өөрийн баазтайгаа тулгаж үзээд олж чадаагүй нөхцөлд дээрхи алдааг өгдөг. Энэ нь хэн нэгэн хүн тухайн сайтыг дуурайлгаж хийсэн тохиолдолд гарч ирнэ, эс бөгөөс self signed буюу ямар нэгэн хөндлөнгийн хүлээн зөвшөөрөгдсөн сертификатын байгууллагаас бус тухайн вэбсервер өөрөө өөрийгөө баталж өөрийнхөө үүсгэсэн нийтийн түлхүүрт гарын үсэг зурсан тохиолдолд вэб хөтөч танихгүйгээр ийм алдаа өгч болно.

Нийтийн түлхүүрт дэд бүтэц ашигласан https буюу http over ssl протокол энгийнээр ажиллах зарчим нь товчхондоо ийм бөлгөө.

Saturday, March 09, 2013

Шифрлэлтийн тухайд (cryptography)

Өмнөх бичлэгийг бичиж суухдаа түнэр харанхуйг зүхэж суухаар нэг ч гэсэн лаа асаа гэдэг зарчим санаанд орж дэмий шүүмжилж байхаар салбарын нэг ч гэсэн оюутан олж уншвал далайд дусал нэмэр юм болов уу гээд жаахан онол бичих гэж үзлээ.
Хүн төрөлхтөн анх үүссэн цагаасаа л нэг нэгнээсээ ямарваа нэг мэдээлэл нуух шаардлагатай тулж иржээ. Дайн тулаантай үед нэгэндээ захиа хүргүүлэхдээ элч нь дундаасаа олзлогдвол захиаг тайлж уншихааргүй болгох гэж анх шифрлэлт үүсчээ. Энэ талаар Б.Ринчен гуайн “Нууцыг задруулсан захиа” зохиолд “Хэлэх үг элчийн аманд” гэдэг зарчмаар дурьдсан байдаг. Эртнээс ашиглаж ирсэн хамгийн энгийн шифрлэлтийн жишээ гэвэл зурвасны үсэгнүүдийн байрыг солих байж болно.
Тухайлбал: БОЛД гэсэн зурвасыг цагаан толгойн байрлалаар бүх үсэгнүүдийг нь 2 байр сэлгэн хойш нь шилжүүлвэл Б үсэг Г болж О үсэг П болно. Харин Л үсэг Н болж Д үсэг Ё болно. Тэгэхээр БОЛД гэсэн зурвасыг илгээгч маань энэ зарчмаар зурвасаа нууцалвал ГПНЁ гэсэн үг болох бөгөөд хөндлөнгийн этгээд энэхүү зурвасыг олж авлаа гэхэд ямар ч утгагуй үсэгний комбинаци болж харагдана. Харин зурвасыг хүлээж авч буй тал энэхүү зурвасны үсэгнүүдийг цагаан толгойн дарааллаар аль чигт нь хэдэн удаа шилжүүлж байж үг болгож тайлж унших боломжтой гэдгийг мэдэх шаардлагатай. Манай тохиолдолд хүлээн авагч тал зүүн тийш нь хоёр удаа шилжүүлэх ёстой бөгөөд үүнийг криптографийн түлхүүр гэнэ.
Орчин үед шифрлэлт маань криптографи хэмээх бүхэл бүтэн шинжлэх ухаан болон хөгжжээ. Мэдээллийг шифрлэх үндсэн хоёр төрлийн алгоритм бий болсоноос компьютерийн шинжлэх ухаан эдгээрийг хослуулан ашиглах болжээ. Энэхүү хоёр төрөл нь:
  1. Симетрик (symmetric) буюу тэгш хэмт алгоритм
  2. Асиметрик буюу тэгш бус хэмт алгоритм
Симметрик алгоритмийн хувьд зурвасыг илгээж буй болон хүлээж авч буй талууд адилхан түлхүүр ашиглах ёстой. Өөрөөр хэлбэл өмнө дурьдсан жишээний дагуу илгээгч тал цагаан толгойн дарааллын дагуу баруун тийш хоёр байр шилжүүлж зурвасаа бичиж байхад хүлээн авагч тал зүүн тийш нь хоёр байр сэлгэж зурвасыг унших боломжтой гэдгийг аль аль талууд мэддэг байх ёстой.
Гэтэл энэхүү шифрлэлтийн зарчмаа илгээгч тал хүлээн авагч талд яаж мэдэгдэх вэ? Цагаан толгойн байрлалын дагуу зурвасын үсэгнүүдийг 2 байр сэлгэж уншина уу гэсэн зурвас хамт явуулвал хэн дуртай нь тайлаад уншчих боломжтой болно. Иймээс үүнийг давж гарахын тулд асиметрик алгоритм үүсчээ.

Асиметрик алгоритм. Зураг дээр дарж томруулж үзнэ үү

Асиметрик алгоритмийн хувьд хүлээн авагч тал нийтийн (public) болон хувийн (private) гэсэн хос түлхүүртэй байх шаардлагатай. Энэхүү хос түлхүүр нь математик алгоритм дээр үндэслэж нэгнээр нь шифрлэсэн мэдээллийг зөвхөн нөгөө түлхүүрээр нь тайлдаг байхаар зохиогдсон. Өөрөөр хэлбэл нийтийн түлхүүрээр шифрлэсэн мэдээллийг зөвхөн хувийн түлхүүрээр л тайлж унших боломжтой бөгөөд нийтийн түлхүүрээр буцаагаад тайлах оролдлого хийсэн ч ямар нэгэн үр дүнд хүрэхгүй юм.
Иймээс манай тохиолдолд хүлээн авагч тал эхлээд илгээгч талд нийтийн түлхүүрээ өгөх бөгөөд илгээгч тал нууц зурвасаа хүлээн авагч талын нийтийн түлхүүрээр шифрлээд буцаагаад явуулна. Харин хүлээн авагч тал шифрлэсэн зурвасыг өөрийн хувийн түлхүүрээр тайлж унших ёстой. Энэхүү алгоритмын сул тал нь математик загвараар тооцоолол нэлээдгүй хийх шаардлагатай болдог.
Асиметрик алгоритм. Зураг дээр дарж томруулж үзнэ үү

Компьютерийн шинжлэх ухаанд энэхүү хоёр алгоритмыг ихэвчлэн хослуулж ашигладаг бөгөөд аль алинийхаа сул талыг нөхөж ажиллах ёстой. Өөрөөр хэлбэл асиметрик алгоритм ашиглан симетрик алгоритмын түлхүүрийг солилцох бөгөөд үүнээс цааш симетрик алгоритмаар мэдээллээ нууцлаж солилцох боломжтой болно.
Үүний үр дүнд дан ганц асиметрик алгоритм ашигласантай харьцуулахад тооцооллын зардал бага гарах бол симетрик алгоритмийг дангаар нь ашиглаж түлхүүрээ бусдад алдахгүй байх боломжтой болно. Хүлээн авагч талын нийтийн түлхүүрийг дундаас нь хэн нэгэн этгээд олж авсан ч гэсэн уг нийтийн түлхүүрээр тухайн мэдээллийг тайлж унших боломжгүй байх бөгөөд зөвхөн хүлээн авагч талд буй хувийн түлхүүрээр л уг мэдээллийн нууцлал тайлагдана.
Дараагийн удаад энэхүү хоёр алгоритмыг амьдрал дээр хэрхэн ашиглаж байгаа талаар тайлбарлахыг хичээе.

Эмийн санч, эмч хоёрын ялгаа


Өчигдөр МТ инженерээр сурч буй төгсөх курсын таньдаг дүү хүү онлайн таараад зөвлөгөө асууж байна. Нэг найзтайгаа хамтраад вэб хийж байгаа, аюулгүй байдлын ямар сертификат авбал зүгээр вэ гэнэ. Би гайхаад тийм их нууцлал шаардах вэб хийж байгаа юм уу гэж асуулаа. Яриаг нь сонсоод байтал үгүй бололтой, тэгээд аюулгүй байдлын сертификат яагаад тавих гээд байгааг нь асуутал хакдуулахаас хамгаална биз дээ гэнээ. Дөлөө энэ талаар бас өмнө нь бичиж байсан учраас давхар нуршаад ч яах вэ. Гэхдээ энэ яриа надад хэдхэн хоногийн өмнө Red Hat –ийн нэг инженерийн ярьж байсан зүйлсийг санагдуулсан юм.
Veteran буюу ахмад дайчин гэж хэлэгдэхээр хорь гаруй жил Линкус систем дээр ажиллаж байгаа хижээлдүү насны мань эрийн яриа нэлээд сонирхолтой санагдсан болохоор энд сийрүүлээд тавилаа.
“Анх биднийг МТ сурч байхад одоогийнх шиг олон янзын abstraction, машины ажиллагааг нууж хүнд таатай байдлаар харуулах хэрэглэгчийн олон янзын интерфэйс байсангүй. Бид бичиж буй кодоо машинд тааруулж, өөрсдөө машины оронд өөрсдийгөө тавьж төсөөлж байгаад бичдэг байлаа. Харин одоо бол бүх юм өөр. Машины өөрийнх нь хүчин чадал ч өсч, хэр баргийн код санах ой дүүргэчихнэ гэж айх юмгүй болж. Код хэтэрхий удаан ачааллана гэж санаа зоволтгүй болжээ. Одоо чиний барьж байгаа утас л гэхэд миний тухайн үед ажиллаж байсан серверээс хамаагүй илүү хүчин чадалтай.
Хөгжил дэвшлийн энэ давуу тал бол мэдээж хэрэг зөндөө байлгүй яах вэ. Гэхдээ нэг л маш том сул тал харагдаад байгаа юм. Энэ нь юу вэ гэхээр бүх юм хэтэрхий хэрэглэгчид хялбар болоод ирэхээр доод цөм ойлголт, үндсэн зарчмаа мэддэг хүн байхгүй болоод байна.
Өнөөдөр хаана ч ялгаагүй ихэнх систем админууд интернетээс жор хуулж бичээд өвчтөнд өгчихдөг эмийн санч шиг болжээ. Тухайн үед гарсан асуудлыг “гал унтраах” зарчмаар зогсоогоод л асуудлынхаа үндэс суурийг ойлгохгүй, цаашаа яаж хамгаалахаа мэдэхгүй байна. Кодерууд ч ялгаагүй, бичсэн код нь юун дээр ажиллахыг тооцдог хүн тун цөөхөн байх шиг. Угтаа МТ –ийн хүн эмч шиг л асуудлын ул суурийг сайн мэддэг, үндэслэлтэйгээр асуудалд ханддаг байх шаардлагатай юм. Үүнээс улбаалж буй гол асуудал бол бид өөрсдөө машиныхаа боол нь болох, биднээс машины түвшинд арай илүү дээр мэдлэгтэй нэгэнд хакдуулах нүх сүвээ өөрсдөө бэлддэгт байгаа юм” гэж билээ.
Надад лав их бодитой санагдсан. Учир нь Монголд  дөнгөж сургууль төгссөн байтугай салбартаа нэлээн хэдэн жил ажиллачихсан нөхдүүд бичиж байгаа кодныхоо цаад учрыг олоогүй зүгээр ажиллаж байна гээд суугаад байдаг нь Холливуудын киноноос баахан хараал сурчихаад өөрийгөө Англи хэлтэй хүн гэж бодоод байдагтай ижил санагддаг. Энд тухайн хүний буруу гэхээсээ системийн буруу их байгаа болов уу. Нэг л их .NET, visual орчинд програмчлал заасаар байгаад оюутан маань машинаасаа хэт хөндийрөөд байх шиг. Их сургуульд хэтэрхий их онол үзээд байна гэж шүүмжлээд байдаг, гэхдээ үндсэн концепцоо оюутан ч багш ч ойлгохгүй, заана гэж илэх төдий болоод өнгөрдөг асуудал их бий.
Мань хөгшин сисадмины ярьж байсан бас нэгэн жишээ гэвэл: “Саяхан хэдхэн жилийн өмнө нэлээн мундаг авъяастай гэгддэг кодер хийсэн програмаа сервер дээр тавиадах гээд өгсөн. Би SELinux –ийн журмуудаа кодонд нь зориулж өөрчлөх гээд удаад байсан чинь яараад байна хурдан ажилуулаадах SELinux –ээ унтраа гэсээр байгаад тавиулчихлаа. Маргааш өглөө нь ажилдаа ирэхэд нэг хүн аль хэзээний мань хүний кодноос олсон алдаагаар дамжиж процессийг нь эзэлж аваад /tmp дүүргээд buffer overflow болгочихсон байж билээ. Тэрнээс хойш би хашраад ямар ч “мундаг” кодерын үгэнд итгэхээ байсандаа”
Энд дурьдсан шиг 64K –д багтааж 3D анимэйшнь ассемблер дээр бичих ч яах вэ. Гэхдээ ядаж аюулгүй байдлын сертификат гэдэг нь бичиж байгаа кодны чинь алдаатай ямар ч хамаа байхгүй зүйл шүү гэдгийг их сургууль төгсөж байгаа нөхдөд жаахан ойлгуулмаар. 
Ассемблер дээр бичсэн 3D видео. Нийт кодны хэмжээ нь 64K