1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
|
---
title: Бүлэг 16. Jails буюу Шоронгууд
part: хэсэг III. Системийн Удирдлага
prev: books/handbook/security
next: books/handbook/mac
showBookMenu: true
weight: 20
path: "/books/handbook/jails/"
---
[[jails]]
= Jails буюу Шоронгууд
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 16
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/jails/
ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]
ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
[[jails-synopsis]]
== Ерөнхий агуулга
Энэ бүлэг нь FreeBSD-ийн шоронгууд гэж юу болох, тэдгээрийг хэрхэн ашиглах талаар тайлбарлах болно. Шоронгууд буюу заримдаа __chroot орчнууд__ын өргөжүүлсэн орлуулалт гэгддэг энэ боломж нь системийн администраторуудад зориулагдсан маш хүчтэй хэрэгсэл боловч тэдгээрийн үндсэн хэрэглээ нь илүү дэвшилтэт хэрэглэгчдэд бас үр ашигтай байдаг.
[IMPORTANT]
====
Шоронгууд нь хүчирхэг хэрэгсэл боловч аюулгүй байдлын хувьд мундаг биш юм. Шоронд хийсэн процесс өөрөө оргох боломжгүй ч шоронгийн гаднах зөвшөөрөлгүй хэрэглэгч шоронд байгаа зөвшөөрөлтэй хэрэглэгчтэй холбогдож улмаар хост орчинд эрх дээшлүүлэх хэд хэдэн арга байдаг гэдгийг мэдэх нь чухал юм.
Эдгээр ихэнх халдлагуудыг хост орчин дахь зөвшөөрөлгүй хэрэглэгчдийн хувьд шоронгийн root руу хандах боломжгүй болгосноор шийдэж болох юм. Гэхдээ ерөнхийдөө итгэл олгогдоогүй бөгөөд шоронд зөвшөөрөлтэй хандах хэрэглэгчдэд хост орчинд хандах эрх өгөх ёсгүй юм.
====
Энэ бүлгийг уншсаны дараа, та дараах зүйлсийг мэдэх болно:
* Шорон гэж юу болох, FreeBSD-ийн суулгалтуудад ямар зорилгоор ашиглагдаж болох талаар.
* Шоронг хэрхэн бүтээх, эхлүүлэх, болон зогсоох талаар.
* Шоронгийн гадна болон дотор талаас хийгдэж болох удирдлагын үндсүүд.
Шоронгийн тухай ашигтай мэдээллийн өөр бусад эхүүдийг дурдвал:
* man:jail[8] гарын авлагын хуудас. Энэ нь `jail` хэрэгслийн бүрэн гүйцэд авлага юм - `jail` нь FreeBSD дээр FreeBSD шоронгуудыг эхлүүлэх, зогсоох, болон хянахад ашиглагдаж болох удирдлагын хэрэгсэл юм.
* Захидлын жагсаалтууд болон тэдгээрийн архивууд. {freebsd-questions} болон бусад захидлын жагсаалтуудын архивууд нь {mailing-lists} дээр байрладаг бөгөөд шоронгуудын талаар маш баялаг материалуудыг агуулсан байдаг. Архивуудаас хайх юм уу эсвэл link:{freebsd-questions-url}[freebsd-questions] захидлын жагсаалт уруу шинэ асуултаа илгээх нь үргэлж сонирхолтой байдаг.
[[jails-terms]]
== Шоронгуудтай холбоотой ойлголтууд
Шоронгуудтай холбоотой FreeBSD системийн хэсгүүд, тэдгээрийн дотоод хэсгүүд болон FreeBSD-ийн бусад хэсэгтэй хэрхэн харилцдаг арга замыг илүүтэй ойлгохыг хөнгөвчлөхийн тулд энэ бүлэгт дараах ойлголтуудыг ашиглах болно:
man:chroot[8] (тушаал)::
Процесс болон түүний бүх үр удмуудын root санг өөрчилдөг FreeBSD-ийн man:chroot[2] системийн дуудлагыг ашигладаг хэрэгсэл.
man:chroot[2] (орчин)::
"chroot"-д ажиллаж байгаа процессуудын орчин. Үүнд харагдаж байгаа файлын системийн хэсэг, байгаа хэрэглэгч болон бүлэг, сүлжээний интерфэйсүүд болон бусад IPC арга замууд гэх мэт эх үүсвэрүүд ордог.
man:jail[8] (тушаал)::
Шоронгийн орчин дотор процессуудыг ажиллуулах боломжийг олгох системийн удирдлагын хэрэгсэл.
хост (систем, процесс, хэрэглэгч, гэх мэт.)::
Шоронгийн системийн хяналтын систем. Хост систем нь байгаа бүх тоног төхөөрөмжийн эх үүсвэрүүдэд хандах боломжтой байдаг бөгөөд шоронгийн орчны болон түүний гаднах процессуудыг хянаж чаддаг. Хост системийн шоронгоос ялгарах нэг чухал ялгаа нь шорон доторх супер хэрэглэгчийн процессуудад хамаарах хязгаарлалтууд хост системийн процессуудын хувьд үйлчилдэггүй явдал юм.
хост хийгдсэн (систем, процесс, хэрэглэгч, гэх мэт.)::
FreeBSD шоронгоор эх үүсвэрүүдэд ханддаг хандалт нь хязгаарлагддаг процесс, хэрэглэгч эсвэл бусад зүйлс.
[[jails-intro]]
== Танилцуулга
Системийн удирдлага нь хэцүү, самууруулмаар ажил болохоор администраторын амьдралыг хялбар болгох үүднээс олон хүчирхэг хэрэгслүүд хийгдэж хөгжүүлэгдсэн байдаг. Эдгээр хэрэгслүүд нь системийг суулгах, тохируулах, болон арчлахад нэгэн төрлийн өргөтгөлүүдийг ихэвчлэн хангаж өгдөг. Администраторуудын хийх ёстой эдгээр ажлуудын нэг хэсэг нь системийн аюулгүй байдлыг зөв тохируулах явдал юм. Ингэснээр аюулгүй байдлын зөрчлүүдгүйгээр систем өөрийн жинхэнэ зорилгоороо үйлчлэх болно.
FreeBSD системийн аюулгүй байдлыг сайжруулахад ашиглагдаж болох хэрэгслүүдийн нэг нь _jails_ буюу _шоронгууд_ юм. Шоронгуудыг FreeBSD 4.X дээр {phk} анх танилцуулсан юм. Гэхдээ тэдгээрийг хүчирхэг, уян хатан дэд систем болгохын тулд FreeBSD 5.X дээр илүү ихээр сайжруулсан билээ. Тэдгээрийн ашигтай тал, ажиллагаа болон найдвартай байдлыг өргөжүүлэн тэдгээрийн хөгжүүлэлт үргэлжилсэн хэвээр болой.
[[jails-what]]
=== Шорон гэж юу вэ
BSD-тэй төстэй үйлдлийн системүүд нь 4.2BSD-ийн үеэс эхлэн man:chroot[2] боломжтой болсон билээ. man:chroot[8] хэрэгсэл нь процессуудын олонлогийн root санг өөрчлөхөд ашиглагдаж аюулгүй орчин үүсгэн системийн бусад хэсгээс тэдгээрийг тусгаарладаг. chroot хийгдсэн орчинд үүсгэгдсэн процессууд нь өөрийн орчноос гаднах файлууд болон эх үүсвэрүүдэд хандаж чаддаггүй. Энэ шалтгаанаар chroot хийгдсэн орчинд ажиллаж байгаа үйлчилгээг эвдэх нь халдагчид бүхэл системийг эвдэх боломжийг олгох ёсгүй юм. man:chroot[8] хэрэгсэл нь маш их уян хатан чанар эсвэл төвөгтэй, дэвшилтэт боломжуудыг шаарддаггүй хялбар ажлуудад сайн байдаг. Мөн chroot ойлголтын эхлэлээс эхлээд л chroot хийгдсэн орчноос зугтах олон арга замууд олдсон бөгөөд хэдийгээр тэдгээр нь FreeBSD цөмийн орчин үеийн хувилбаруудад засагдсан боловч man:chroot[2] нь үйлчилгээнүүдийг аюулгүй болгоход зориулагдсан туйлын шийдэл биш нь тодорхой байсан юм. Үүнтэй холбоотой шинэ дэд систем хийгдэх шаардлагатай болсон байна.
Энэ нь _шоронгууд_ яагаад хөгжүүлэгдсэн гол шалтгаануудын нэг юм.
Шоронгууд нь уламжлалт man:chroot[2] орчны ойлголтуудыг хэд хэдэн аргаар сайжруулдаг. Уламжлалт man:chroot[2] орчинд процессууд нь өөрийн хандаж болох файлын системийн нэг хэсэгт хязгаарлагдаж байдаг. Системийн бусад эх үүсвэрүүд (системийн хэрэглэгчид, ажиллаж байгаа процессууд, эсвэл сүлжээний дэд систем зэрэг) нь chroot хийгдсэн процессууд болон хост системийн процессуудын хооронд хуваалцан хэрэглэгддэг. Шоронгууд нь зөвхөн файлын систем уруу хандах хандалт биш бас хэрэглэгчид, FreeBSD цөмийн сүлжээний дэд систем болон бусад хэд хэдэн зүйлсүүдийг виртуалчлан энэ загварыг өргөтгөдөг байна. Шорон болгосон орчны хандалтыг тааруулахад зориулсан илүү бүрэн гүйцэд нарийн тааруулсан хяналтуудын олонлог байдаг нь <<jails-tuning>> хэсэгт тайлбарлагдсан байгаа.
Шорон дөрвөн элементээр тодорхойлогддог:
* Сангийн дэд мод - шоронгийн орж ирдэг эхлэл цэг. Шорон дотор орсны дараа процессийг энэ дэд модноос гадна зугтахыг зөвшөөрдөггүй. Анхдагч man:chroot[2] дизайныг зовоосон аюулгүй байдлын уламжлалт асуудлууд нь FreeBSD шоронгуудад байдаггүй.
* Хостын нэр - шорон дотор ашиглагдах хостын нэр. Шоронгууд нь сүлжээний үйлчилгээнүүдийг хост хийхэд (байрлуулах) ихэвчлэн ашиглагддаг болохоор шорон бүрийн хувьд тодорхойлсон нэртэй байх нь системийн администраторт ихээхэн тус болж чадах юм.
* IP хаяг - энэ нь шорон бүрт өгөгдөх бөгөөд шоронгийн оршин тогтнох хугацаанд ямар ч талаараа өөрчлөгдөх ёсгүй. Шоронгийн IP хаяг нь ихэвчлэн байгаа сүлжээний интерфэйсийн alias хаяг байх боловч заавал тийм байх шаардлагагүй юм.
* Тушаал - шорон дотор ажиллах програм/тушаалын зам. Энэ нь шоронгийн орчны root сантай харьцангуй байх бөгөөд шоронгийн тусгай очны төрлөөс хамаараад асар өөр өөр байж болох юм.
Эдгээрээс гадна шоронгууд нь өөрийн гэсэн хэрэглэгчид болон өөрийн `root` хэрэглэгчтэй байж болдог. Мэдээжийн хэрэг `root` хэрэглэгчийн хүч чадал шоронгийн орчин дотор хязгаарлагддаг бөгөөд хост системийн үүднээс авч үзвэл шоронгийн `root` хэрэглэгч нь бүхнийг чадагч хэрэглэгч биш юм. Мөн шоронгийн `root` хэрэглэгчид өөрийнх нь харгалзах man:jail[8] орчноос гадна осолтой үйлдлүүдийг систем дээр хийлгэхийг зөвшөөрдөггүй. `root` хэрэглэгчийн боломжууд болон хязгаарлалтуудын тухай дэлгэрэнгүй мэдээллийг <<jails-tuning>> хэсэгт доор хэлэлцэх болно.
[[jails-build]]
== Шоронг үүсгэж хянах нь
Зарим администраторууд шоронг дараах хоёр төрөлд хуваадаг: эдгээр нь жинхэнэ FreeBSD системтэй адил төстэй "бүрэн" шоронгууд болон нэг програм юм уу эсвэл үйлчилгээнд зориулагдсан, магадгүй зөвшөөрлүүдтэй ажиллах "үйлчилгээ" шоронгууд юм. Энэ нь зөвхөн ухагдахууны хуваагдал бөгөөд шоронг бүтээх процесс үүнд хамаагүй юм. man:jail[8] гарын авлагын хуудас шоронг бүтээх аргачлалын талаар маш тодорхой зааварласан буй:
[source,shell]
....
# setenv D /here/is/the/jail
# mkdir -p $D <.>
# cd /usr/src
# make buildworld <.>
# make installworld DESTDIR=$D <.>
# make distribution DESTDIR=$D <.>
# mount -t devfs devfs $D/dev <.>
....
<.> Шоронгийн байрлалыг сонгох нь хамгийн шилдэг эхлэх цэг юм. Энэ нь шорон физикээр өөрийн хостын файлын систем дотор байрлах байрлал юм. Сайн сонголт нь [.filename]#/usr/jail/jailname# байж болох бөгөөд энд байгаа _jailname_ нь шоронг таниулж байгаа хостын нэр юм. [.filename]#/usr/# файлын систем нь шоронгийн файлын системийн хувьд ихэвчлэн хангалттай зайтай байдаг. Үндсэндээ "бүрэн" шоронгуудын хувьд энэ шоронгийн файлын систем нь үндсэн FreeBSD системийн андагч суулгацад байдаг бүх файлуудын хуулбар байдаг.
<.> Хэрэв та өөрийн хэрэглэгчийн талбарыг `make world` эсвэл `make buildworld` тушаалаар аль хэдийн бүтээсэн бол та энэ алхмыг алгасаж өөрийн хэрэглэгчийн талбарыг шинэ шорон руу суулгаж болно.
<.> Энэ тушаал нь шоронгийн физик байрлал болгон сонгосон сангийн дэд модыг файлын систем дээр шаардлагатай хоёртын файлууд, сангууд, гарын авлагын хуудаснууд гэх зэргүүдийг тараан байрлуулах болно.
<.> make тушаалд зориулагдсан `distribution` тохируулга нь бүх шаардлагатай тохиргооны файлыг суулгана, өөрөөр хэлбэл энэ нь [.filename]#/usr/src/etc/# сангийн бүх суулгаж болох файлуудыг шоронгийн орчны [.filename]#/etc# сан болох [.filename]#$D/etc/# руу хуулдаг.
<.> Шорон дотор man:devfs[8] файлын системийг холбох шаардлагагүй. Нөгөө талаас авч үзвэл дурын, бараг бүх програм өөрийн зорилгоосоо хамааран хамгийн багаар бодоход ядаж ганц төхөөрөмжид хандах шаардлагатай байдаг. Шорон дотроос төхөөрөмжид хандах хандалтыг хянах нь маш чухал байдаг. Учир нь буруу тохируулгууд халдагчид шорон дотор муухай зүйлс хийх боломжийг олгож болох юм. man:devfs[8] дээрх хяналтыг man:devfs[8] болон man:devfs.conf[5] гарын авлагын хуудаснуудад тайлбарласан дүрмийн олонлогуудаар удирддаг.
Шорон суулгагдсаны дараа man:jail[8] хэрэгсэл ашиглан түүнийг эхлүүлж болно. man:jail[8] хэрэгсэл дөрвөн зайлшгүй шаардлагатай нэмэлт өгөгдлийг авдаг бөгөөд эдгээр нь <<jails-what>> хэсэгт тайлбарлагдсан байгаа болно. Өөр бусад нэмэлт өгөгдлүүдийг бас зааж өгч болох бөгөөд өөрөөр хэлбэл шорон хийгдсэн процессийг тухайн нэг хэрэглэгчийн итгэмжлэлүүдтэй ажиллуулж болох юм. `_command_`-н нэмэлт өгөгдөл нь шоронгийн төрлөөс хамаарна; _виртуал системийн_ хувьд [.filename]#/etc/rc# нь боломжийн сонголт байна. Энэ нь жинхэнэ FreeBSD системийн эхлүүлэх дарааллыг хуулбарлах учраас тэр юм. _Үйлчилгээ_ шоронгийн хувьд шорон дотор ажиллах үйлчилгээ эсвэл програмаас энэ нь хамаарна.
Шоронгууд нь ихэвчлэн ачаалах үед эхлүүлэгддэг бөгөөд FreeBSD [.filename]#rc# арга зам нь үүнийг хийх хялбар аргаар хангадаг.
[.procedure]
====
. Ачаалах үед эхлэхээр идэвхжүүлэгдсэн шоронгуудын жагсаалтыг man:rc.conf[5] файлд нэмэх ёстой:
+
[.programlisting]
....
jail_enable="YES" # Set to NO to disable starting of any jails
jail_list="www" # Space separated list of names of jails
....
+
[NOTE]
======
`jail_list` хувьсагчид өгөгдсөн байгаа шоронгийн нэрс зөвхөн үсэг, тооноос бүрдсэн байх ёстой.
======
+
. Шорон бүрийг тайлбарласан man:rc.conf[5] тохируулгуудын бүлэг `jail_list`-д жагсаагдсан шорон бүрийн хувьд доор дурдсаныг нэмэх ёстой:
+
[.programlisting]
....
jail_www_rootdir="/usr/jail/www" # jail's root directory
jail_www_hostname="www.example.org" # jail's hostname
jail_www_ip="192.168.0.10" # jail's IP address
jail_www_devfs_enable="YES" # mount devfs in the jail
jail_www_devfs_ruleset="www_ruleset" # devfs ruleset to apply to jail
....
+
man:rc.conf[5]-д тохируулагдсан шоронгуудын анхдагч эхлүүлэлт нь шоронг бүрэн виртуал систем гэж тооцдог шоронгийн [.filename]#/etc/rc# скриптийг ажиллуулах болно. Үйлчилгээний шоронгуудын хувьд `jail__jailname__exec_start` тохируулгыг зохистойгоор тохируулан шоронгийн анхдагч эхлүүлэх тушаалыг өөрчлөх ёстой.
+
[NOTE]
======
Тохируулгуудын бүрэн жагсаалтыг man:rc.conf[5] гарын авлагын хуудаснаас үзнэ үү.
======
====
Шоронд зориулагдсан оруулга [.filename]#rc.conf# файлд байгаа тохиолдолд man:service[8] шоронг гараар эхлүүлэх эсвэл зогсооход ашиглагдаж болох юм:
[source,shell]
....
# service jail start www
# service jail stop www
....
Одоогоор man:jail[8]-г зогсоох цэвэр зам байхгүй байгаа. Цэвэр системийн зогсолтыг хийх тушаалуудыг шорон дотор ашиглах боломжгүй байдаг болохоор тэр юм. Шоронг зогсоох хамгийн шилдэг арга бол дараах тушаалыг шорон дотроос ажиллуулах эсвэл шоронгийн гадна man:jexec[8] хэрэгслийг ашиглах явдал юм:
[source,shell]
....
# sh /etc/rc.shutdown
....
Үүний талаар дэлгэрэнгүй мэдээллийг man:jail[8] гарын авлагын хуудаснаас олж болно.
[[jails-tuning]]
== Нарийн тааруулалт болон удирдлага
Аль ч шоронд зориулж тохируулж болох хэд хэдэн тохируулгууд байдаг бөгөөд өндөр түвшний програмуудыг хийхийн тулд хост FreeBSD системийг шоронгуудтай цуг хослуулах төрөл бүрийн аргууд бас байдаг. Энэ хэсэг нь дараах зүйлсийг үзүүлнэ:
* Ажиллагаа болон шоронгийн суулгалтаар хийгдсэн аюулгүй байдлын хязгаарлалтуудыг тааруулахад зориулагдсан зарим тохируулгууд.
* FreeBSD-ийн портын цуглуулгад байх, шорон дээр суурилсан шийдлүүдийг хийхэд ашиглагдаж болох шорон удирдах зарим нэг өндөр түвшний програмууд.
[[jails-tuning-utilities]]
=== FreeBSD дээр шорон тааруулах системийн хэрэгслүүд
Шоронгийн тохиргооны нарийн сайн тааруулалтыг man:sysctl[8] хувьсагчуудыг тохируулснаар ихэвчлэн хийдэг. Бүх хамаатай тохируулгуудыг зохион байгуулах үндэс болон sysctl-ийн тусгай дэд мод байдаг: энэ нь FreeBSD цөмийн тохируулгуудын `security.jail.*` шатлал юм. Энд шоронтой холбоотой гол sysctl-уудын жагсаалтыг тэдгээрийн анхдагч утгуудтайгаар харуулав. Нэрс нь өөрийгөө тайлбарласан байгаа, гэхдээ тэдгээрийн талаар илүү мэдээллийг man:jail[8] болон man:sysctl[8] гарын авлагын хуудаснуудаас лавлана уу.
* `security.jail.set_hostname_allowed: 1`
* `security.jail.socket_unixiproute_only: 1`
* `security.jail.sysvipc_allowed: 0`
* `security.jail.enforce_statfs: 2`
* `security.jail.allow_raw_sockets: 0`
* `security.jail.chflags_allowed: 0`
* `security.jail.jailed: 0`
`root` хэрэглэгчид анхдагчаар ноогдуулсан хязгаарлалтуудын заримыг нэмэх эсвэл хасахын тулд эдгээр хувьсагчуудыг _хост системийн_ администратор ашиглаж болно. Зарим нэг хязгаарлалтуудыг хасаж болохгүйг тэмдэглэе. `root` хэрэглэгчид man:jail[8] дотор файлын системүүдийг холбох эсвэл салгахыг зөвшөөрдөггүй. Шорон доторх `root` хэрэглэгч man:devfs[8] дүрмийн олонлогуудыг дуудах эсвэл буцааж болиулах, галт ханын дүрмүүдийг тохируулах, эсвэл цөмийн `securelevel` хувьсагчийг тохируулах зэрэг цөм дэх өгөгдлийн өөрчлөлтүүдийг шаарддаг өөр олон бусад удирдлагын ажлуудыг хийж чадахгүй байж болох юм.
FreeBSD-ийн үндсэн систем нь идэвхтэй шоронгуудын тухай мэдээллийг үзүүлэх болон удирдлагын тушаалуудыг ажиллуулахын тулд шоронд залгагдаж болох хялбар хэрэгслүүдийн цуглуулгыг агуулдаг. man:jls[8] болон man:jexec[8] тушаалууд нь FreeBSD-ийн үндсэн системийн хэсэг бөгөөд дараах хялбар ажлуудыг хийж гүйцэтгэхэд ашиглагдаж болно:
* Идэвхтэй байгаа шоронгуудын жагсаалт болон тэдгээрийн харгалзах шорон танигч (JID), IP хаяг, хостын нэр болон замыг үзүүлнэ.
* Өөрийнх нь хост системээс ажиллаж байгаа шоронд залгагдаж шорон дотор тушаал ажиллуулах юм уу эсвэл шоронгийн удирдлагын ажлуудыг шорон дотор ажиллуулна. `root` хэрэглэгч шоронг цэвэрхэн зогсоож унтраахыг хүсэх үед энэ нь ялангуяа ашигтай байдаг. Шорон дотор удирдлага хийхийн тулд түүн дотор бүрхүүл эхлүүлэхэд man:jexec[8] хэрэгсэл бас ашиглагдаж болдог; жишээ нь:
+
[source,shell]
....
# jexec 1 tcsh
....
[[jails-tuning-admintools]]
=== FreeBSD-ийн портын цуглуулга дахь өндөр түвшний удирдлагын хэрэгслүүд
Шорон удирдлагад зориулагдсан гуравдагч талуудын олон хэрэгслүүдийн дундаас хамгийн бүрэн гүйцэд, ашигтай нь package:sysutils/jailutils[] юм. Энэ нь man:jail[8]-ийн удирдлагад хувь нэмэр болсон жижиг програмуудын цуглуулга юм. Дэлгэрэнгүй мэдээллийн талаар түүний вэб хуудсанд хандана уу.
[[jails-application]]
== Шоронгийн хэрэглээ
[[jails-service-jails]]
=== Үйлчилгээ шоронгууд
Энэхүү хэсэг нь {simon} хөгжүүлэгчийн http://simon.nitro.dk/service-jails.html[http://simon.nitro.dk/service-jails.html] хуудас болон Кен Том mailto:locals@gmail.com[locals@gmail.com]-ийн бичсэн шинэчилсэн нийтлэл дээр гаргасан санаа дээр тулгуурласан юм. Энэ хэсэг нь man:jail[8] боломжийг ашиглан аюулгүй байдлын нэмэлт давхарга бүхий FreeBSD систем хэрхэн тохируулах талаар тайлбарлах болно. Өгөгдсөн систем нь ядаж RELENG_6_0 бөгөөд энэ бүлгийн өмнө дурдсан мэдээллийг уншигч авхай сайн ойлгосон гэж тооцдог.
[[jails-service-jails-design]]
==== Шийдэл
Шоронгуудын гол асуудлуудын нэг нь тэдгээрийн шинэчлэлтийн процессийн удирдлага юм. Шорон бүр нь шинэчлэгдэх болгондоо дахин бүр эхнээсээ бүтээгдэх хэрэгтэй болдог учраас тэр юм. Нэг шоронгийн хувьд энэ нь ихэвчлэн асуудал болдоггүй, шинэчлэлтийн процесс их хялбар байдаг боловч олон шоронгууд үүсгэсэн бол их хугацаа шаардсан, төвөгтэй ажиллагаа байдаг.
[WARNING]
====
Энэхүү тохиргоо нь FreeBSD-ийн маш сайн туршлага болон түүний боломжуудын хэрэглээг шаарддаг. Хэрэв доор үзүүлсэн алхмууд нь хэтэрхий төвөгтэй санагдвал FreeBSD шоронгуудыг удирдах илүү хялбар боломжийг олгодог бөгөөд энэ тохиргооных шиг төвөгтэй биш package:sysutils/qjail[] эсвэл package:sysutils/ezjail[] зэрэг хялбар системийг үзэхийг зөвлөж байна.
====
Гол санаа нь иймэрхүү асуудлуудыг шоронгууд хооронд аль болох ихээр аюулгүй аргаар хуваалцах замаар шийдэх явдал юм - шинэчлэлт хялбар байхаар зөвхөн уншигдах man:mount_nullfs[8] холболтуудыг ашиглах болон ганц үйлчилгээнүүдийг тусдаа шоронд хийх нь илүүтэй болох юм. Мөн энэ нь шоронгуудыг нэмэх эсвэл устгах болон тэдгээрийг шинэчлэх хялбар боломжийг олгодог юм.
[NOTE]
====
Ийм зорилгоор ашиглаж болох үйлчилгээнүүдийг дурдвал: HTTP сервер, DNS сервер, SMTP сервер гэх мэт байж болох юм.
====
Энэ хэсэгт тайлбарласан тохиргооны зорилгуудыг дурдвал:
* Шоронгийн хялбар, ойлгоход амархан бүтцийг үүсгэх. Энэ нь шорон бүрийн хувьд болон тэдгээр дээр бүрэн хэмжээний installworld үйлдлийг _ажиллуулахгүй_ байх гэсэн үг юм.
* Шинэ шоронгууд нэмэх эсвэл байгааг нь устгах процессийг хялбар болгох.
* Байгаа шоронгуудыг шинэчлэх эсвэл сайжруулах процессийг хялбар болгох.
* Өөрчлөн тохируулсан FreeBSD салбарыг ажиллуулах боломжтой болгох.
* Нэвтрэн орох, эвдлэн орох боломжийг аль болох ихээр багасгаж аюулгүй байдлын хувьд паранойд байх.
* Зай болон inode-уудыг аль болох ихээр хэмнэх.
Урьд нь дурдагдсаны адил энэ шийдэл нь шорон бүрт зөвхөн уншигдахаар (nullfs гэгддэг) холбогдох ганц мастер загвар болон шорон бүрийн хувьд нэг уншигдах, бичигдэх төхөөрөмжтэй байх бүтэц дээр үндсэндээ тулгуурласан юм. Төхөөрөмж нь тусдаа физик диск, хуваалт, эсвэл vnode дээр тулгуурласан man:md[4] төхөөрөмж байж болох юм. Энэ жишээн дээр бид уншигдах, бичигдэх nullfs холболтуудыг ашиглах болно.
Файлын системийн дүр зураг доор дурдсан хэсэгт тайлбарласан буй:
* Шорон бүр [.filename]#/home/j# сангийн доор холбогдох болно.
* [.filename]#/home/j/mroot# нь шорон бүрийн хувьд загвар ба бүх шоронгуудын хувьд зөвхөн уншигдах хуваалт юм.
* [.filename]#/home/j# сангийн доор шорон бүрийн хувьд хоосон сан үүсгэгдэнэ.
* Шорон бүр системийн уншигдах, бичигдэх хэсэг уруу холбогдох [.filename]#/s# сантай байна.
* Шорон бүр [.filename]#/home/j/skel# дээр тулгуурласан өөрийн уншигдах, бичигдэх системтэй байх болно.
* Шоронгийн талбар бүр (шорон бүрийн уншигдах, бичигдэх хэсэг) [.filename]#/home/js#-д үүсгэгдэх болно.
[NOTE]
====
Энэ нь шоронгууд [.filename]#/home# хуваалтын доор үндэслэсэн гэж үзнэ. Үүнийг мэдээж өөрчилж болох боловч ингэх тохиолдолд доор дурдсан жишээ бүрийн хувьд өөрчлөгдөх ёстой болно.
====
[[jails-service-jails-template]]
==== Загвар үүсгэх нь
Энэ хэсэг нь шоронд зориулагдан ашиглагдах, зөвхөн уншигдах хэсэг болох мастер загварыг үүсгэхэд хэрэгтэй алхмуудыг тайлбарлах болно.
FreeBSD системийг сүүлийн -RELEASE салбар уруу шинэчлэх нь үргэлж зөв санаа байдаг. Үүнийг хийхийн тулд гарын авлагын crossref:cutting-edge[makeworld,бүлгээс] лавлах хэрэгтэй. Шинэчлэл хийх шаардлагагүй бол гүйцэтгэлийг гүйцээхийн тулд buildworld хийх шаардлагатай. Мөн package:sysutils/cpdup[] багц хэрэгтэй. FreeBSD-ийн портын цуглуулгыг татаж авахдаа бид man:portsnap[8] хэрэгслийг ашиглах болно. Эхлэн суралцагчид гарын авлагын crossref:#portsnap[portsnap,Portsnap бүлгийг] унших нь зүйтэй юм.
[.procedure]
====
. Эхлээд бидний шоронгуудад зориулсан FreeBSD-ийн хоёртын файлуудыг агуулах зөвхөн уншигдах файлын системийн сангийн бүтцийг үүсгэх хэрэгтэй бөгөөд дараа нь FreeBSD-ийн эх модны сан уруу сангаа сольж ороод зөвхөн уншигдах файлын системийг шоронгийн загвар уруу суулгах хэрэгтэй:
+
[source,shell]
....
# mkdir /home/j /home/j/mroot
# cd /usr/src
# make installworld DESTDIR=/home/j/mroot
....
+
. Дараа нь шоронгуудад зориулж FreeBSD-ийн портын цуглуулга болон mergemaster-т шаардлагатай, FreeBSD-ийн эх модыг бэлдэх хэрэгтэй:
+
[source,shell]
....
# cd /home/j/mroot
# mkdir usr/ports
# portsnap -p /home/j/mroot/usr/ports fetch extract
# cpdup /usr/src /home/j/mroot/usr/src
....
+
. Системийн уншигдах, бичигдэх хэсэгт зориулж араг ясыг үүсгэх хэрэгтэй:
+
[source,shell]
....
# 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
....
+
. Байхгүй байгаа тохиргооны файлуудыг суулгахын тулд mergemaster-г ашиглах хэрэгтэй. Дараа нь mergemaster-ийн үүсгэсэн илүү сангуудыг арилгах хэрэгтэй:
+
[source,shell]
....
# 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
....
+
. Одоо уншигдах, бичигдэх файлын системийг зөвхөн уншигдах файлын систем уруу заасан симболын холбоос үүсгэх хэрэгтэй. Симболын холбоосууд нь зөв [.filename]#s/# байрлалуудад үүсгэгдсэн эсэхийг шалгаарай. Жинхэнэ сангууд юм уу эсвэл сангуудын үүсгэлт буруу байрлалуудад хийгдсэн бол суулгалт амжилтгүй болоход хүргэнэ.
+
[source,shell]
....
# 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
....
+
. Сүүлийн шатанд доор дурдсан агуулга бүхий ерөнхий [.filename]#/home/j/skel/etc/make.conf# файлыг үүсгэх хэрэгтэй:
+
[.programlisting]
....
WRKDIRPREFIX?= /s/portbuild
....
+
`WRKDIRPREFIX`-г ийм байдлаар тохируулах нь шорон бүрт FreeBSD-ийн портуудыг эмхэтгэх боломжтой болгох юм. Портуудын сан нь зөвхөн уншигдах системийн хэсэг гэдгийг санаарай. `WRKDIRPREFIX`-д зориулсан өөр зам нь шорон бүрийн уншигдах, бичигдэх хэсэгт бүтээлтүүдийг хийх боломжийг олгох юм.
====
[[jails-service-jails-creating]]
==== Шорон үүсгэх нь
Одоо бид бүрэн гүйцэд FreeBSD-ийн шоронгийн загвартай болсон болохоор [.filename]#/etc/rc.conf# файлд бид шоронгуудыг суулган тохируулах боломжтой болно. Энэ жишээ нь "NS", "MAIL" болон "WWW" гэсэн 3 шоронгийн үүсгэлтийг харуулж байна.
[.procedure]
====
. Доор дурдсан мөрүүдийг [.filename]#/etc/fstab# файлд нэмэх хэрэгтэй. Ингэснээр шоронгуудад зориулсан зөвхөн уншигдах загвар болон уншигдах, бичигдэх зай тохирох шоронгуудад ашиглах боломжтой болох юм:
+
[.programlisting]
....
/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
....
+
[NOTE]
======
0 pass буюу өнгөрөх дугаараар тэмдэглэгдсэн хуваалтууд нь ачаалах үед man:fsck[8] хэрэгслээр шалгагддаггүй бөгөөд 0 dump дугаараар тэмдэглэгдсэн хуваалтууд нь man:dump[8] хэрэгслээр нөөцлөгддөггүй. Бид fsck хэрэгслээр nullfs холболтуудыг шалгах эсвэл dump хэрэгслээр шоронгуудын зөвхөн уншигдах nullfs холболтуудыг нөөцлөхийг хүсэхгүй байгаа билээ. Дээр дурдсан [.filename]#fstab# оруулга бүрийн сүүлийн хоёр багана "0 0" гэж тэмдэглэгдсэн учир нь энэ юм.
======
+
. Шоронгуудыг [.filename]#/etc/rc.conf#-д тохируулах хэрэгтэй:
+
[.programlisting]
....
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"
....
+
[WARNING]
======
`jail__name__rootdir` хувьсагчийн утга [.filename]#/home#-ийн оронд [.filename]#/usr/home# гэсэн шалтгаан нь FreeBSD-ийн үндсэн суулгац дээр [.filename]#/home# сангийн физик зам нь [.filename]#/usr/home# гэж байдагт оршиж байгаа юм. `jail__name__rootdir` хувьсагчийн утга симбол холбоос бүхий зам байхаар тохируулагдсан байх _ёсгүй_ бөгөөд хэрэв ингэвэл шоронгууд ажиллаж эхлэхгүй байх болно. Энэ хувьсагчийн утгад тавьж болох утгыг олохдоо man:realpath[1]-г ашиглах хэрэгтэй. Дэлгэрэнгүй мэдээллийг FreeBSD-SA-07:01.jail Аюулгүй байдлын Зөвлөгөөнөөс үзнэ үү.
======
+
. Шорон бүрийн зөвхөн уншигдах файлын системд зориулсан, шаардлагатай холбох цэгүүдийг үүсгэнэ:
+
[source,shell]
....
# mkdir /home/j/ns /home/j/mail /home/j/www
....
+
. Шорон бүрт уншигдах, бичигдэх загварыг суулгах хэрэгтэй. package:sysutils/cpdup[] хэрэгслийн хэрэглээг энд тэмдэглэх нь зүйтэй юм. Энэ нь сан бүрийн зөв хуулбарыг хийхэд тусалдаг:
+
[source,shell]
....
# mkdir /home/js
# cpdup /home/j/skel /home/js/ns
# cpdup /home/j/skel /home/js/mail
# cpdup /home/j/skel /home/js/www
....
+
. Энэ үед шоронгууд нь бүтээгдэж ажиллахад бэлтгэгдсэн байна. Эхлээд шорон бүрийн хувьд шаардлагатай файлын системийг холбож дараа нь тэдгээрийг jail rc скрипт ашиглан эхлүүлэх хэрэгтэй:
+
[source,shell]
....
# mount -a
# service jail start
....
====
Шоронгууд нь одоо ажиллаж байх ёстой. Тэдгээрийг зөв эхэлсэн эсэхийг шалгахын тулд man:jls[8] тушаалыг ашиглана. Үүний гаралт доор дурдсантай төстэй байх ёстой:
[source,shell]
....
# 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 бүхий шорон дотор удирдлагын ажлуудыг гүйцэтгэхийн тулд дараах тушаалыг ашиглах хэрэгтэй:
[source,shell]
....
# jexec 3 tcsh
....
[[jails-service-jails-upgrading]]
==== Шинэчлэх нь
Аюулгүй байдлын асуудлаас болоод эсвэл одоо байгаа шоронгуудад ашигтай шинэ боломжууд хийгдсэнээс болоод системээ FreeBSD-ийн шинэ хувилбар уруу шинэчлэх шаардлага заримдаа гардаг. Энэ тохиргооны дизайн нь байгаа шоронгуудыг хялбар аргаар шинэчлэх боломжийг олгодог. Мөн шоронгуудыг сүүлийн минутанд зогсоодог болохоор энэ нь тэдгээрийн зогсох хугацааг багасгадаг. Бас ямар нэг асуудал гарахад энэ нь хуучин хувилбар уруугаа шилжих боломжийг олгодог.
[.procedure]
====
. Эхний алхам нь хост системийг журмын дагуу шинэчлэх явдал юм. Дараа шинэ, түр зуурын, зөвхөн уншигдах загварыг [.filename]#/home/j/mroot2#-д үүсгэх хэрэгтэй.
+
[source,shell]
....
# 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` ажиллахдаа цөөн хэрэггүй сангуудыг үүсгэдэг бөгөөд эдгээрийг устгах хэрэгтэй:
+
[source,shell]
....
# chflags -R 0 var
# rm -R etc var root usr/local tmp
....
+
. Мастер файлын системд зориулж уншигдах, бичигдэх симболын холбоосуудыг дахин үүсгэх хэрэгтэй:
+
[source,shell]
....
# 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
....
+
. Шоронгуудыг зогсоох зөв үе нь одоо байна:
+
[source,shell]
....
# service jail stop
....
+
. Эх файлын системүүдийг салгах хэрэгтэй:
+
[source,shell]
....
# 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
....
+
[NOTE]
======
Уншигдах, бичигдэх системүүд нь зөвхөн уншигдах системд залгагдсан ([.filename]#/s#) бөгөөд эхлээд салгагдах ёстой.
======
+
. Хуучин зөвхөн уншигдах файлын системийг шилжүүлж шинээр сольно. Ямар нэг юм болохоо байхад энэ нь хуучин, зөвхөн уншигдах файлын системийн нөөц болон архив маягаар ашиглагдах юм. Энд ашиглагдсан нэрлэх аргачлал нь шинэ, зөвхөн уншигдах файлын систем үүсгэгдэх үеийнхтэй тохирдог. Зай болон inode-уудыг хэмнэхийн тулд FreeBSD-ийн эх портын цуглуулгыг шинэ файлын систем уруу шилжүүлэх хэрэгтэй:
+
[source,shell]
....
# cd /home/j
# mv mroot mroot.20060601
# mv mroot2 mroot
# mv mroot.20060601/usr/ports mroot/usr
....
+
. Энэ үед шинэ, зөвхөн уншигдах загвар бэлэн болох бөгөөд үлдсэн цорын ганц ажил нь файлын системүүдийг дахин холбож шоронгуудыг эхлүүлэх явдал юм:
+
[source,shell]
....
# mount -a
# service jail start
....
====
Шоронгууд зөв эхэлсэн эсэхийг шалгахын тулд man:jls[8]-г ашиглана. Шорон бүрт mergemaster-г ажиллуулахаа мартуузай. Тохиргооны файлууд болон rc.d скриптүүдийг шинэчлэх хэрэгтэй болно.
|