Powered by Blogger.

DISABLE SELINUX

GIT – Góc IT xin hướng dẫn các bạn các    và giới thiệu về SELinux ( SELinux là gì )
SELinux (Security-Enhanced ) được tạo bởi NSA. Những gì SELinux làm được là khóa điều khiển truy cập vào các ứng dụng. Thật tuyệt vời phải không. Chắc chắn SELinux cũng có một vài điều gây khó chịu cho người sử dụng như việc gây chậm cho hệ thống hay khiến cho một vài ứng dụng trở nên khó cài đặt. Nhưng những tiện lợi về bảo mật khi sử dụng SELinux (hoặc Apparmor) vượt trôi hơn so với những nhược điểm mà nó có. Bạn có thể kích hoạt SELinux trong quá trình cài đặt .

Để Disable SELinux, chúng ta thay đổi file /etc/selinux/config như sau
# vi /etc/selinux/config
Thay đổi SELINUX=enforcing
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
thành SELINUX=disabled 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted
Việc vô hiệu hóa SELinux sẽ thực hiện khi bạn khi bạn khởi động lại server.
Để thực hiện việc vô hiệu hóa SELinux không cần khởi động lại server, bạn có thể thực hiện lệnh sau:
# setenforce 0
Server sẽ tự động chuyển lại chế độ enforcing khi bạn khởi động lại server nếu thực hiện dòng lệnh setenforce 0
Giới thiệu SELinux
Hầu hết các hệ điều hành dùng các phương pháp điều khiển truy cập (acess control) để xác định một thực thể (người dùng hay chương trình) có thể truy cập vào một tài nguyên nào đó hay không. Các hệ thống dựa trên Unix dùng một dạng discretionary access control (DAC). Phương pháp này giới hạn truy cập vào các đối tượng dựa trên các nhóm mà chúng thuộc về. Ví dụ, các file trong GNU/Linux có một owner, một group, và một tập các permission. Các permission định nghĩa ai có thể truy cập vào một file nào, ai có thể đọc, ai có thể ghi, và ai có thể thực thi file đó. Những permission này được chia thành ba tập hợp gồm có user, đại diện cho người dùng (owner của file), group (tất cả các user thuộc một group), và others (các user không thuộc hai nhóm trên).
Cơ chế điều khiển cồng kềnh này nảy sinh một vấn đề, vì một chương trình xâm nhập vào hệ thống sẽ thừa hưởng quyền truy cập của user thực thi chương trình. Do đó chương trình có thể làm mọi việc mà user đó được quyền. Thay vì định nghĩa cơ chế điều khiển theo cách này, việc thực hiện theo nguyên tắc “quyền tối thiểu” tỏ ra an toàn hơn. Nguyên tắc này phát biểu như sau: các chương trình chỉ có thể làm những gì chúng cần để thực hiện nhiệm vụ, ngoài ra không được làm gì khác. Ví dụ, nếu bạn có một chương trình đáp ứng các yêu cầu đến một socket mà không cần phải truy cập vào file system, thì chương trình đó chỉ được phép lắng nghe trên một socket cố định và không có quyền đụng đến file system. Với cách này, nếu chương trình bị xâm nhập, quyền truy cập của nó cũng được tối thiểu hoá rõ ràng. Kiểu điều khiển này được gọi là mandatory access control (MAC).
Một cách tiếp cận khác để điều khiển truy cập là role-based access control (RBAC). Trong cơ chế RBAC, permission được cung cấp dựa trên các vai trò (role) được gán bởi hệ thống bảo mật. Khái niệm của một role khác với khái niệm của một “group” truyền thống ở chỗ một group đại diện cho một hay nhiều user. Một role có thể đại diện cho nhiều user, nhưng nó cũng đại diện cho các permission mà một tập các user có thể thực hiện.
SELinux bổ sung cả cơ chế MAC và RBAC cho hệ thống GNU/Linux. Phần tiếp theo sẽ đi sâu vào hiện thực của SELinux và việc thi hành các quy tắc bảo mật được thêm vào Linux kernel một cách trong suốt như thế nào.
Hiện thực bảo mật trên Linux
Trong thời kỳ đầu của SELinux, khi nó vẫn còn là một bộ các bản vá, nó đã đưa ra framework security riêng. Điều này trở thành rắc rối bởi vì nó gắn cứng GNU/Linux vào một kiến trúc acess control duy nhất. Thay vì chấp nhận một cách điều khiển duy nhất như vậy, Linux kernel thừa kế một framework chung, trong đó tách biệt phần policy và phần thi hành (kiểu như lập pháp và hành pháp – ND). Giải pháp này được biết đến với tên gọi Linux Security Module (LSM) framework. LSM cung cấp một framework đa năng dành cho bảo mật, trong đó cho phép các mô hình bảo mật được hiện thực như là những module mà kernel có thể tải lên được (xem hình 1).
Hình 1. Security policy and enforcement are independent using SELinux.
Mã nguồn của kernel được hiệu chỉnh để trước khi truy cập vào các đối tượng bên trong, nó sẽ gọi một hook đại diện cho một hàm thi hành. Hàm này hiện thực cho security policy, nó xác thực hành động có được tiến hành hay không dựa trên những policy được khai báo trước. Các hàm security được chứa trong một cấu trúc các thao tác security bao gồm những thao tác cơ bản cần phải được bảo vệ. Ví dụ, hàm security_socket_create hook (security_ops->socket_create) kiểm tra các permission trước khi tạo một socket mới và xem xét họ giao thức, loại, giao thức, và socket được tạo trong kernel-space hay user-space. Dưới đây là mã nguồn minh hoạ của file /linux/net/socket.c khi tạo socket.
static int __sock_create(int family, int type, int protocol,
struct socket **res, int kern) {
* Check protocol is in range
int err; struct socket *sock; /* */
return -EAFNOSUPPORT;
if (family < 0 || family >= NPROTO) if (type < 0 || type >= SOCK_MAX)
err = security_socket_create(family, type, protocol, kern);
return -EINVAL;
if (err)
return err;
Hàm security_socket_create được định nghĩa trong ./linux/include/linux/security.h. Nó làm trung gian để gọi đến hàm được cài đặt động trong security_opsstructure. Xem mã nguồn minh hoạ:
static inline int security_socket_create (int family, int type,
int protocol, int kern)
{
return security_ops->socket_create(family, type, protocol, kern);
}
Hàm trong cấu trúc được cài đặt bởi security module. Bằng cách này, các hook được định nghĩa trong module SELinux mà kernel có thể tải lên được. Mỗi lời gọi SELinux được định nghĩa trong một file chứa các hook hoàn tất việc trung gian giữa hàm của kernel đến lời gọi động cho một security module cụ thể. Xem mã nguồn minh hoạ từ /linux/security/selinux/hooks.c
static int selinux_socket_create(int family, int type,
int protocol, int kern)
{ int err = 0;
if (kern)
struct task_security_struct *tsec;
err = avc_has_perm(tsec->sid, tsec->sid,
goto out; tsec = current->security;
socket_type_to_security_class(family, type,
return err;
protocol), SOCKET__CREATE, NULL); out:
}
Trọng tâm của đoạn code là lời gọi xác nhận hành động hiện tại của tác vụ hiện tại (được định nghĩa bởi current->security, trong đó current đại diện cho tác vụ hiện tại đang thực thi ) có được cho phép không. Access Vector Cache (AVC) là một cache của những quyết định SELinux trước đó (để tăng hiệu suất xử lý). Lời gọi này bao gồm source security identifier (sid), security class (được tạo thành từ những chi tiết của hành động được yêu cầu), lời gọi socket cụ thể, và tùy chọn cho hỗ trợ kiểm tra dữ liệu. Nếu không tìm thấy quyết định trong cache, máy chủ security sẽ được gọi để ra quyết định (quy trình được mô tả trong hình 2).

Hình 2. Layered Linux security process
Các hàm hook mà security_ops gọi đến được định nghĩa động như là một module kernel có thể tải lên được (thông qua register_security()), còn trong trường hợp không có module nào được load thì nó sẽ chứa những hàm dummy (xem /linux/security/dummy.c ). Những hàm này sẽ hiện thực policy theo chuẩn Linux DAC. Các hook tồn tại ở tất cả những điểm mà sự can thiệp vào object cần phải được cung cấp để đảm bảo an toàn. Sự can thiệp này gồm có thao tác quản lý (creation, signaling, waiting), nạp chương trình (execve), quản lý hệ thống file (superblock, inode, và filehooks), IPC (message queues, shared memory, và semaphore operations), module hooks (chèn và xoá), và network hooks (gồm có sockets, netlink, network devices, và những giao diện protocol khác). Có thể xem thêm về các loại hook này trong file security.h.

Những cách tiếp cận khác

SELinux là một trong những security framework dễ hiểu nhất hiện nay, nhưng dĩ nhiên nó không phải là duy nhất. Ngoài ra còn có:
AppArmor
Solaris 10 (was Trusted Solaris)
TrustedBSD
Operating system virtualization
Tham khảo
SELinux has two major components on your system. There’s the kernel mechanism which is enforcing a bunch of access rules which apply to processes and files. And secondly, there’s file labels : every file on your system has extra labels attached to it which tie-in with those access rules. Run ls -Z and you’ll see what I mean
For the operating system as a whole, there is two kinds of disabling:
  • Permissive – switch the SELinux kernel into a mode where every operation is allowed. Operations that would be denied are allowed and a message is logged identifying that it would be denied. The mechanism that defines labels for files which are being created/changed is still active.
  • Disabled – SELinux is completely switched off in the kernel. This allows all operations to be permitted, and also disables the process which decides what to label files & processes with.
Disabling SELinux could lead to problems if you want to re-enable it again later. When the system runs with file labelling disable it will create files with no label – which could cause problems if the system is booted into Enforcement mode. A full re-labelling of the file system will be necessary.
Disabling SELinuxFully disabling SELinux goes one step further than just switching into permissive mode. Disabling will completely disable all SELinux functions including file and process labelling.
Run the following  to check if SELinux is running:
# getenforce
You can effectively disable it by running the following command
# setenforce Permissive
This will put selinux in a passive mode until the machine is rebooted. If you would like to permanently alter the attributes of selinux, view the SELINUX= line in /etc/sysconfig/selinux
    Blogger Comment
    Facebook Comment