16.6. Шоронгийн хэрэглээ
Өмнөх | Бүлэг 16. Jails буюу Шоронгууд | Дараах

## 16.6. Шоронгийн хэрэглээ

### 16.6.1. Үйлчилгээ шоронгууд

Хувь нэмэр болгон оруулсан Даниэл Гэрзо.

Энэхүү хэсэг нь Simon L. B. Nielsen хөгжүүлэгчийн http://simon.nitro.dk/service-jails.html хуудас болон Кен Том `<locals@gmail.com>`-ийн бичсэн шинэчилсэн нийтлэл дээр гаргасан санаа дээр тулгуурласан юм. Энэ хэсэг нь jail(8) боломжийг ашиглан аюулгүй байдлын нэмэлт давхарга бүхий FreeBSD систем хэрхэн тохируулах талаар тайлбарлах болно. Өгөгдсөн систем нь ядаж RELENG_6_0 бөгөөд энэ бүлгийн өмнө дурдсан мэдээллийг уншигч авхай сайн ойлгосон гэж тооцдог.

#### 16.6.1.1. Шийдэл

Шоронгуудын гол асуудлуудын нэг нь тэдгээрийн шинэчлэлтийн процессийн удирдлага юм. Шорон бүр нь шинэчлэгдэх болгондоо дахин бүр эхнээсээ бүтээгдэх хэрэгтэй болдог учраас тэр юм. Нэг шоронгийн хувьд энэ нь ихэвчлэн асуудал болдоггүй, шинэчлэлтийн процесс их хялбар байдаг боловч олон шоронгууд үүсгэсэн бол их хугацаа шаардсан, төвөгтэй ажиллагаа байдаг.

### Сануулга:

Энэхүү тохиргоо нь FreeBSD-ийн маш сайн туршлага болон түүний боломжуудын хэрэглээг шаарддаг. Хэрэв доор үзүүлсэн алхмууд нь хэтэрхий төвөгтэй санагдвал FreeBSD шоронгуудыг удирдах илүү хялбар боломжийг олгодог бөгөөд энэ тохиргооных шиг төвөгтэй биш `sysutils/qjail` эсвэл `sysutils/ezjail` зэрэг хялбар системийг үзэхийг зөвлөж байна.

Гол санаа нь иймэрхүү асуудлуудыг шоронгууд хооронд аль болох ихээр аюулгүй аргаар хуваалцах замаар шийдэх явдал юм — шинэчлэлт хялбар байхаар зөвхөн уншигдах mount_nullfs(8) холболтуудыг ашиглах болон ганц үйлчилгээнүүдийг тусдаа шоронд хийх нь илүүтэй болох юм. Мөн энэ нь шоронгуудыг нэмэх эсвэл устгах болон тэдгээрийг шинэчлэх хялбар боломжийг олгодог юм.

### Тэмдэглэл:

Ийм зорилгоор ашиглаж болох үйлчилгээнүүдийг дурдвал: HTTP сервер, DNS сервер, SMTP сервер гэх мэт байж болох юм.

Энэ хэсэгт тайлбарласан тохиргооны зорилгуудыг дурдвал:

- Шоронгийн хялбар, ойлгоход амархан бүтцийг үүсгэх. Энэ нь шорон бүрийн хувьд болон тэдгээр дээр бүрэн хэмжээний installworld үйлдлийг ажиллуулахгүй байх гэсэн үг юм.

- Шинэ шоронгууд нэмэх эсвэл байгааг нь устгах процессийг хялбар болгох.

- Байгаа шоронгуудыг шинэчлэх эсвэл сайжруулах процессийг хялбар болгох.

- Өөрчлөн тохируулсан FreeBSD салбарыг ажиллуулах боломжтой болгох.

- Нэвтрэн орох, эвдлэн орох боломжийг аль болох ихээр багасгаж аюулгүй байдлын хувьд паранойд байх.

- Зай болон inode-уудыг аль болох ихээр хэмнэх.

Урьд нь дурдагдсаны адил энэ шийдэл нь шорон бүрт зөвхөн уншигдахаар (nullfs гэгддэг) холбогдох ганц мастер загвар болон шорон бүрийн хувьд нэг уншигдах, бичигдэх төхөөрөмжтэй байх бүтэц дээр үндсэндээ тулгуурласан юм. Төхөөрөмж нь тусдаа физик диск, хуваалт, эсвэл vnode дээр тулгуурласан md(4) төхөөрөмж байж болох юм. Энэ жишээн дээр бид уншигдах, бичигдэх nullfs холболтуудыг ашиглах болно.

Файлын системийн дүр зураг доор дурдсан хэсэгт тайлбарласан буй:

- Шорон бүр `/home/j` сангийн доор холбогдох болно.

- `/home/j/mroot` нь шорон бүрийн хувьд загвар ба бүх шоронгуудын хувьд зөвхөн уншигдах хуваалт юм.

- `/home/j` сангийн доор шорон бүрийн хувьд хоосон сан үүсгэгдэнэ.

- Шорон бүр системийн уншигдах, бичигдэх хэсэг уруу холбогдох `/s` сантай байна.

- Шорон бүр `/home/j/skel` дээр тулгуурласан өөрийн уншигдах, бичигдэх системтэй байх болно.

- Шоронгийн талбар бүр (шорон бүрийн уншигдах, бичигдэх хэсэг) `/home/js`-д үүсгэгдэх болно.

### Тэмдэглэл:

Энэ нь шоронгууд `/home` хуваалтын доор үндэслэсэн гэж үзнэ. Үүнийг мэдээж өөрчилж болох боловч ингэх тохиолдолд доор дурдсан жишээ бүрийн хувьд өөрчлөгдөх ёстой болно.

#### 16.6.1.2. Загвар үүсгэх нь

Энэ хэсэг нь шоронд зориулагдан ашиглагдах, зөвхөн уншигдах хэсэг болох мастер загварыг үүсгэхэд хэрэгтэй алхмуудыг тайлбарлах болно.

FreeBSD системийг сүүлийн -RELEASE салбар уруу шинэчлэх нь үргэлж зөв санаа байдаг. Үүнийг хийхийн тулд гарын авлагын бүлгээс лавлах хэрэгтэй. Шинэчлэл хийх шаардлагагүй бол гүйцэтгэлийг гүйцээхийн тулд buildworld хийх шаардлагатай. Мөн `sysutils/cpdup` багц хэрэгтэй. FreeBSD-ийн портын цуглуулгыг татаж авахдаа бид portsnap(8) хэрэгслийг ашиглах болно. Эхлэн суралцагчид гарын авлагын Portsnap бүлгийг унших нь зүйтэй юм.

1. Эхлээд бидний шоронгуудад зориулсан FreeBSD-ийн хоёртын файлуудыг агуулах зөвхөн уншигдах файлын системийн сангийн бүтцийг үүсгэх хэрэгтэй бөгөөд дараа нь FreeBSD-ийн эх модны сан уруу сангаа сольж ороод зөвхөн уншигдах файлын системийг шоронгийн загвар уруу суулгах хэрэгтэй:

   `#` `mkdir /home/j /home/j/mroot` `#` `cd /usr/src` `#` `make installworld DESTDIR=/home/j/mroot`

2. Дараа нь шоронгуудад зориулж FreeBSD-ийн портын цуглуулга болон mergemaster-т шаардлагатай, FreeBSD-ийн эх модыг бэлдэх хэрэгтэй:

   `#` `cd /home/j/mroot` `#` `mkdir usr/ports` `#` `portsnap -p /home/j/mroot/usr/ports fetch extract` `#` `cpdup /usr/src /home/j/mroot/usr/src`

3. Системийн уншигдах, бичигдэх хэсэгт зориулж араг ясыг үүсгэх хэрэгтэй:

   `#` `mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles` `#` `mv etc /home/j/skel` `#` `mv usr/local /home/j/skel/usr-local` `#` `mv tmp /home/j/skel` `#` `mv var /home/j/skel` `#` `mv root /home/j/skel`

4. Байхгүй байгаа тохиргооны файлуудыг суулгахын тулд mergemaster-г ашиглах хэрэгтэй. Дараа нь mergemaster-ийн үүсгэсэн илүү сангуудыг арилгах хэрэгтэй:

   `#` `mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i` `#` `cd /home/j/skel` `#` `rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev`

5. Одоо уншигдах, бичигдэх файлын системийг зөвхөн уншигдах файлын систем уруу заасан симболын холбоос үүсгэх хэрэгтэй. Симболын холбоосууд нь зөв `s/` байрлалуудад үүсгэгдсэн эсэхийг шалгаарай. Жинхэнэ сангууд юм уу эсвэл сангуудын үүсгэлт буруу байрлалуудад хийгдсэн бол суулгалт амжилтгүй болоход хүргэнэ.

   `#` `cd /home/j/mroot` `#` `mkdir s` `#` `ln -s s/etc etc` `#` `ln -s s/home home` `#` `ln -s s/root root` `#` `ln -s ../s/usr-local usr/local` `#` `ln -s ../s/usr-X11R6 usr/X11R6` `#` `ln -s ../../s/distfiles usr/ports/distfiles` `#` `ln -s s/tmp tmp` `#` `ln -s s/var var`

6. Сүүлийн шатанд доор дурдсан агуулга бүхий ерөнхий `/home/j/skel/etc/make.conf` файлыг үүсгэх хэрэгтэй:

   WRKDIRPREFIX?= /s/portbuild

   `WRKDIRPREFIX`-г ийм байдлаар тохируулах нь шорон бүрт FreeBSD-ийн портуудыг эмхэтгэх боломжтой болгох юм. Портуудын сан нь зөвхөн уншигдах системийн хэсэг гэдгийг санаарай. `WRKDIRPREFIX`-д зориулсан өөр зам нь шорон бүрийн уншигдах, бичигдэх хэсэгт бүтээлтүүдийг хийх боломжийг олгох юм.

#### 16.6.1.3. Шорон үүсгэх нь

Одоо бид бүрэн гүйцэд FreeBSD-ийн шоронгийн загвартай болсон болохоор `/etc/rc.conf` файлд бид шоронгуудыг суулган тохируулах боломжтой болно. Энэ жишээ нь «NS», «MAIL» болон «WWW» гэсэн 3 шоронгийн үүсгэлтийг харуулж байна.

1. Доор дурдсан мөрүүдийг `/etc/fstab` файлд нэмэх хэрэгтэй. Ингэснээр шоронгуудад зориулсан зөвхөн уншигдах загвар болон уншигдах, бичигдэх зай тохирох шоронгуудад ашиглах боломжтой болох юм:

   /home/j/mroot /home/j/ns nullfs ro 0 0 /home/j/mroot /home/j/mail nullfs ro 0 0 /home/j/mroot /home/j/www nullfs ro 0 0 /home/js/ns /home/j/ns/s nullfs rw 0 0 /home/js/mail /home/j/mail/s nullfs rw 0 0 /home/js/www /home/j/www/s nullfs rw 0 0

   ### Тэмдэглэл:

   0 pass буюу өнгөрөх дугаараар тэмдэглэгдсэн хуваалтууд нь ачаалах үед fsck(8) хэрэгслээр шалгагддаггүй бөгөөд 0 dump дугаараар тэмдэглэгдсэн хуваалтууд нь dump(8) хэрэгслээр нөөцлөгддөггүй. Бид fsck хэрэгслээр nullfs холболтуудыг шалгах эсвэл dump хэрэгслээр шоронгуудын зөвхөн уншигдах nullfs холболтуудыг нөөцлөхийг хүсэхгүй байгаа билээ. Дээр дурдсан `fstab` оруулга бүрийн сүүлийн хоёр багана «0 0» гэж тэмдэглэгдсэн учир нь энэ юм.

2. Шоронгуудыг `/etc/rc.conf`-д тохируулах хэрэгтэй:

   jail_enable="YES" jail_set_hostname_allow="NO" jail_list="ns mail www" jail_ns_hostname="ns.example.org" jail_ns_ip="192.168.3.17" jail_ns_rootdir="/usr/home/j/ns" jail_ns_devfs_enable="YES" jail_mail_hostname="mail.example.org" jail_mail_ip="192.168.3.18" jail_mail_rootdir="/usr/home/j/mail" jail_mail_devfs_enable="YES" jail_www_hostname="www.example.org" jail_www_ip="62.123.43.14" jail_www_rootdir="/usr/home/j/www" jail_www_devfs_enable="YES"

   ### Сануулга:

   `jail_`name`_rootdir` хувьсагчийн утга `/home`-ийн оронд `/usr/home` гэсэн шалтгаан нь FreeBSD-ийн үндсэн суулгац дээр `/home` сангийн физик зам нь `/usr/home` гэж байдагт оршиж байгаа юм. `jail_`name`_rootdir` хувьсагчийн утга симбол холбоос бүхий зам байхаар тохируулагдсан байх ёсгүй бөгөөд хэрэв ингэвэл шоронгууд ажиллаж эхлэхгүй байх болно. Энэ хувьсагчийн утгад тавьж болох утгыг олохдоо realpath(1)-г ашиглах хэрэгтэй. Дэлгэрэнгүй мэдээллийг FreeBSD-SA-07:01.jail Аюулгүй байдлын Зөвлөгөөнөөс үзнэ үү.

3. Шорон бүрийн зөвхөн уншигдах файлын системд зориулсан, шаардлагатай холбох цэгүүдийг үүсгэнэ:

   `#` `mkdir /home/j/ns /home/j/mail /home/j/www`

4. Шорон бүрт уншигдах, бичигдэх загварыг суулгах хэрэгтэй. `sysutils/cpdup` хэрэгслийн хэрэглээг энд тэмдэглэх нь зүйтэй юм. Энэ нь сан бүрийн зөв хуулбарыг хийхэд тусалдаг:

   `#` `mkdir /home/js` `#` `cpdup /home/j/skel /home/js/ns` `#` `cpdup /home/j/skel /home/js/mail` `#` `cpdup /home/j/skel /home/js/www`

5. Энэ үед шоронгууд нь бүтээгдэж ажиллахад бэлтгэгдсэн байна. Эхлээд шорон бүрийн хувьд шаардлагатай файлын системийг холбож дараа нь тэдгээрийг jail rc скрипт ашиглан эхлүүлэх хэрэгтэй:

   `#` `mount -a` `#` `service jail start`

Шоронгууд нь одоо ажиллаж байх ёстой. Тэдгээрийг зөв эхэлсэн эсэхийг шалгахын тулд jls(8) тушаалыг ашиглана. Үүний гаралт доор дурдсантай төстэй байх ёстой:

`#` `jls` JID IP Address Hostname Path 3 192.168.3.17 ns.example.org /home/j/ns 2 192.168.3.18 mail.example.org /home/j/mail 1 62.123.43.14 www.example.org /home/j/www

Энэ үед шорон бүр рүү нэвтэрч, шинэ хэрэглэгчид нэмэх эсвэл дэмонуудыг тохируулах боломжтой болсон байх ёстой. `JID` багана нь ажиллаж байгаа шорон бүрийн шорон таниулах дугаарыг илэрхийлдэг. `JID` нь 3 бүхий шорон дотор удирдлагын ажлуудыг гүйцэтгэхийн тулд дараах тушаалыг ашиглах хэрэгтэй:

`#` `jexec 3 tcsh`

#### 16.6.1.4. Шинэчлэх нь

Аюулгүй байдлын асуудлаас болоод эсвэл одоо байгаа шоронгуудад ашигтай шинэ боломжууд хийгдсэнээс болоод системээ FreeBSD-ийн шинэ хувилбар уруу шинэчлэх шаардлага заримдаа гардаг. Энэ тохиргооны дизайн нь байгаа шоронгуудыг хялбар аргаар шинэчлэх боломжийг олгодог. Мөн шоронгуудыг сүүлийн минутанд зогсоодог болохоор энэ нь тэдгээрийн зогсох хугацааг багасгадаг. Бас ямар нэг асуудал гарахад энэ нь хуучин хувилбар уруугаа шилжих боломжийг олгодог.

1. Эхний алхам нь хост системийг журмын дагуу шинэчлэх явдал юм. Дараа шинэ, түр зуурын, зөвхөн уншигдах загварыг `/home/j/mroot2`-д үүсгэх хэрэгтэй.

   `#` `mkdir /home/j/mroot2` `#` `cd /usr/src` `#` `make installworld DESTDIR=/home/j/mroot2` `#` `cd /home/j/mroot2` `#` `cpdup /usr/src usr/src` `#` `mkdir s`

   `installworld` ажиллахдаа цөөн хэрэггүй сангуудыг үүсгэдэг бөгөөд эдгээрийг устгах хэрэгтэй:

   `#` `chflags -R 0 var` `#` `rm -R etc var root usr/local tmp`

2. Мастер файлын системд зориулж уншигдах, бичигдэх симболын холбоосуудыг дахин үүсгэх хэрэгтэй:

   `#` `ln -s s/etc etc` `#` `ln -s s/root root` `#` `ln -s s/home home` `#` `ln -s ../s/usr-local usr/local` `#` `ln -s ../s/usr-X11R6 usr/X11R6` `#` `ln -s s/tmp tmp` `#` `ln -s s/var var`

3. Шоронгуудыг зогсоох зөв үе нь одоо байна:

   `#` `service jail stop`

4. Эх файлын системүүдийг салгах хэрэгтэй:

   `#` `umount /home/j/ns/s` `#` `umount /home/j/ns` `#` `umount /home/j/mail/s` `#` `umount /home/j/mail` `#` `umount /home/j/www/s` `#` `umount /home/j/www`

   ### Тэмдэглэл:

   Уншигдах, бичигдэх системүүд нь зөвхөн уншигдах системд залгагдсан (`/s`) бөгөөд эхлээд салгагдах ёстой.

5. Хуучин зөвхөн уншигдах файлын системийг шилжүүлж шинээр сольно. Ямар нэг юм болохоо байхад энэ нь хуучин, зөвхөн уншигдах файлын системийн нөөц болон архив маягаар ашиглагдах юм. Энд ашиглагдсан нэрлэх аргачлал нь шинэ, зөвхөн уншигдах файлын систем үүсгэгдэх үеийнхтэй тохирдог. Зай болон inode-уудыг хэмнэхийн тулд FreeBSD-ийн эх портын цуглуулгыг шинэ файлын систем уруу шилжүүлэх хэрэгтэй:

   `#` `cd /home/j` `#` `mv mroot mroot.20060601` `#` `mv mroot2 mroot` `#` `mv mroot.20060601/usr/ports mroot/usr`

6. Энэ үед шинэ, зөвхөн уншигдах загвар бэлэн болох бөгөөд үлдсэн цорын ганц ажил нь файлын системүүдийг дахин холбож шоронгуудыг эхлүүлэх явдал юм:

   `#` `mount -a` `#` `service jail start`

Шоронгууд зөв эхэлсэн эсэхийг шалгахын тулд jls(8)-г ашиглана. Шорон бүрт mergemaster-г ажиллуулахаа мартуузай. Тохиргооны файлууд болон rc.d скриптүүдийг шинэчлэх хэрэгтэй болно.

Өмнөх | Дээш | Дараах
16.5. Нарийн тааруулалт болон удирдлага | Эхлэл | Бүлэг 17. Mandatory Access Control буюу Албадмал Хандалтын хяналт

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.