# การอ่านและเขียนกฎ Selinux

อินเทอร์เฟซนี้ช่วยให้คุณสามารถดำเนินการอ่านและเขียนกฎ Selinux ของระบบขั้นพื้นฐานได้ ทำให้คุณสามารถตั้งค่าหรือหลีกเลี่ยงข้อจำกัดบางอย่างของระบบได้ อินเทอร์เฟซที่เกี่ยวข้องอาจส่งผลกระทบต่อการทำงานของระบบ โปรดใช้ด้วยความระมัดระวัง คุณจำเป็นต้องมีความเข้าใจเกี่ยวกับ Selinux ด้วยตนเอง

## การรับ Instance สำหรับการดำเนินการ

ก่อนที่จะเริ่ม คุณต้องรับ instance ของ selinux ก่อน

```python
selinux = d.stub("SelinuxPolicy")
```

## การรับสถานะ Selinux

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตรวจสอบว่ากฎ Selinux ถูกเปิดใช้งานอยู่หรือไม่

```python
selinux.enabled()
```

```python
>>> selinux.is_enabled( )
True
```

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตรวจสอบว่าสถานะปัจจุบันเป็น enforce หรือไม่

```python
selinux.get_enforce()
```

```python
>>> selinux.get_enforce()
1
```

## การตั้งค่าสถานะ Selinux

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตั้งค่า Selinux เป็น enforce หรือ permissive

```python
selinux.set_enforce(enable)
```

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตั้งค่าเป็น enforce

```python
>>> selinux.set_enforce(True)
1
```

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตั้งค่าเป็น permissive

```python
>>> selinux.set_enforce( False)
0
```

## การสร้าง Domain ใหม่

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อสร้าง domain ใหม่ใน Selinux

```python
selinux.create_domain(domain_name)
```

```python
>>> selinux.create_domain("hello_selinux")
True
```

## การตั้งค่า Domain เป็น Permissive

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตั้งค่า Selinux domain เป็นสถานะ permissive

```python
selinux.permissive(domain_name)
```

```python
>>> selinux.permissive("untrusted_app")
True
```

## การตั้งค่า Domain เป็น Enforce

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อตั้งค่า Selinux domain เป็นสถานะ enforce

```python
selinux.enforce(domain_name)
```

```python
>>> selinux.enforce("untrusted_app")
True
```

## การปรับแต่งกฎการควบคุมอย่างละเอียด

เรียกใช้อินเทอร์เฟซต่อไปนี้เพื่อเขียนกฎ allow และ disallow ได้อย่างละเอียดมากยิ่งขึ้น

```python
selinux.disallow(source, target, tclass, action)
```

```python
selinux.allow(source, target, tclass, action)
```

โดยที่ `source` และ `target` หมายถึง context ต้นทางและปลายทางตามลำดับ, `tclass` หมายถึงคลาสเป้าหมาย (target class), และ `action` หมายถึงการดำเนินการที่เฉพาะเจาะจง `action` รองรับเพียง `*` (หมายถึงทั้งหมด) หรือการกระทำที่ระบุเท่านั้น พารามิเตอร์ทั้งหมดไม่รองรับ context หรือ action หลายค่า เช่น รูปแบบกฎมาตรฐานอย่าง `{binder system_app}` ในที่นี้คุณสามารถระบุได้เพียงชื่อเดียวเท่านั้น ด้านล่างนี้คือตัวอย่างการดำเนินการ


```python
>>> selinux.allow("hal_camera_default", "camera_vendor_data_file", "dir", "*")
```

กฎข้างต้นหมายถึงการอนุญาตให้ `hal_camera_default` มีสิทธิ์ดำเนินการทั้งหมดกับไดเรกทอรี `camera_vendor_data_file` (`dir`) ในทำนองเดียวกัน การเปลี่ยนเป็นเมธอด `disallow` จะหมายถึงการปฏิเสธสิทธิ์เหล่านี้

```python
>>> selinux.allow("hal_camera_default", "camera_vendor_data_file", "dir", "search")
```

คุณยังสามารถระบุ action ที่ละเอียดขึ้นได้เช่น `search` ดังตัวอย่างข้างต้น