当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 绝非扯淡文章:SElinux安装并且激活permissive mode,应该是国内仅有吧
帖子发表于 : 2006-10-13 23:58 
头像

注册: 2006-04-18 10:13
帖子: 202
地址: china
送出感谢: 0 次
接收感谢: 0 次
SElinux在Ubuntu里安装不费事,可要想激活就难了!

看了很多浪费感情的文章,他们都根本没有想要开SElinux!只是试着安装了一下。

现在我也只是把我目前对Ubuntu的SElinux的认识写在这里,与感兴趣的同仁共享。

Ubuntu的所有版本的Sysvinit都没有打SElinux的补丁吧,所以一定先要给它打上补丁。
先下载一个Sysvinit的最新版的源码包,准备好要打的补丁。这个补丁我是在Gentoo上找到的。内容如下:
diff -urN sysvinit-2.86.orig/src/Makefile sysvinit-2.86/src/Makefile
--- sysvinit-2.86.orig/src/Makefile 2004-06-09 08:47:45.000000000 -0400
+++ sysvinit-2.86/src/Makefile 2005-01-03 20:25:59.922659928 -0500
@@ -12,6 +12,8 @@
CFLAGS = -Wall -O2 -fomit-frame-pointer -D_GNU_SOURCE
LDFLAGS = -s
STATIC =
+CFLAGS += -DWITH_SELINUX
+LDFLAGS += -lselinux -lsepol

# For some known distributions we do not build all programs, otherwise we do.
BIN =
diff -urN sysvinit-2.86.orig/src/init.c sysvinit-2.86/src/init.c
--- sysvinit-2.86.orig/src/init.c 2004-07-30 08:16:20.000000000 -0400
+++ sysvinit-2.86/src/init.c 2005-01-03 20:46:39.485217776 -0500
@@ -42,6 +42,11 @@
#include <stdarg.h>
#include <sys/syslog.h>
#include <sys/time.h>
+#include <sys/mman.h>
+#include <selinux/selinux.h>
+#include <sepol/sepol.h>
+#include <sys/mount.h>
+

#ifdef __i386__
# if (__GLIBC__ >= 2)
@@ -104,6 +109,7 @@
int dfl_level = 0; /* Default runlevel */
sig_atomic_t got_cont = 0; /* Set if we received the SIGCONT signal */
sig_atomic_t got_signals; /* Set if we received a signal. */
+int enforcing = -1; /* SELinux enforcing mode */
int emerg_shell = 0; /* Start emergency shell? */
int wrote_wtmp_reboot = 1; /* Set when we wrote the reboot record */
int wrote_utmp_reboot = 1; /* Set when we wrote the reboot record */
@@ -192,6 +198,142 @@
char *extra_env[NR_EXTRA_ENV];


+/* Mount point for selinuxfs. */
+#define SELINUXMNT "/selinux/"
+
+static int load_policy(int *enforce)
+{
+ int fd=-1,ret=-1;
+ int rc=0, orig_enforce;
+ struct stat sb;
+ void *map;
+ char policy_file[PATH_MAX];
+ int policy_version=0;
+ FILE *cfg;
+ char buf[4096];
+ int seconfig = -2;
+
+ selinux_getenforcemode(&seconfig);
+
+ mount("none", "/proc", "proc", 0, 0);
+ cfg = fopen("/proc/cmdline","r");
+ if (cfg) {
+ char *tmp;
+ if (fgets(buf,4096,cfg) && (tmp = strstr(buf,"enforcing="))) {
+ if (tmp == buf || isspace(*(tmp-1))) {
+ enforcing=atoi(tmp+10);
+ }
+ }
+ fclose(cfg);
+ }
+#define MNT_DETACH 2
+ umount2("/proc",MNT_DETACH);
+
+ if (enforcing >=0)
+ *enforce = enforcing;
+ else if (seconfig == 1)
+ *enforce = 1;
+
+ if (mount("none", SELINUXMNT, "selinuxfs", 0, 0) < 0) {
+ if (errno == ENODEV) {
+ initlog(L_VB, "SELinux not supported by kernel: %s\n",SELINUXMNT,strerror(errno));
+ *enforce = 0;
+ } else {
+ initlog(L_VB, "Failed to mount %s: %s\n",SELINUXMNT,strerror(errno));
+ }
+ return ret;
+ }
+
+ set_selinuxmnt(SELINUXMNT); /* set manually since we mounted it */
+
+ policy_version=security_policyvers();
+ if (policy_version < 0) {
+ initlog(L_VB, "Can't get policy version: %s\n", strerror(errno));
+ goto UMOUNT;
+ }
+
+ orig_enforce = rc = security_getenforce();
+ if (rc < 0) {
+ initlog(L_VB, "Can't get SELinux enforcement flag: %s\n", strerror(errno));
+ goto UMOUNT;
+ }
+ if (enforcing >= 0) {
+ *enforce = enforcing;
+ } else if (seconfig == -1) {
+ *enforce = 0;
+ rc = security_disable();
+ if (rc == 0) umount(SELINUXMNT);
+ if (rc < 0) {
+ rc = security_setenforce(0);
+ if (rc < 0) {
+ initlog(L_VB, "Can't disable SELinux: %s\n", strerror(errno));
+ goto UMOUNT;
+ }
+ }
+ ret = 0;
+ goto UMOUNT;
+ } else if (seconfig >= 0) {
+ *enforce = seconfig;
+ if (orig_enforce != *enforce) {
+ rc = security_setenforce(seconfig);
+ if (rc < 0) {
+ initlog(L_VB, "Can't set SELinux enforcement flag: %s\n", strerror(errno));
+ goto UMOUNT;
+ }
+ }
+ }
+
+ snprintf(policy_file,sizeof(policy_file),"%s.%d",selinux_binary_policy_path(),policy_version);
+ fd = open(policy_file, O_RDONLY);
+ if (fd < 0) {
+ /* Check previous version to see if old policy is available
+ */
+ snprintf(policy_file,sizeof(policy_file),"%s.%d",selinux_binary_policy_path(),policy_version-1);
+ fd = open(policy_file, O_RDONLY);
+ if (fd < 0) {
+ initlog(L_VB, "Can't open '%s.%d': %s\n",
+ selinux_binary_policy_path(),policy_version,strerror(errno));
+ goto UMOUNT;
+ }
+ }
+
+ if (fstat(fd, &sb) < 0) {
+ initlog(L_VB, "Can't stat '%s': %s\n",
+ policy_file, strerror(errno));
+ goto UMOUNT;
+ }
+
+ map = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (map == MAP_FAILED) {
+ initlog(L_VB, "Can't map '%s': %s\n",
+ policy_file, strerror(errno));
+ goto UMOUNT;
+ }
+
+
+ /* Set booleans based on a booleans configuration file. */
+ ret = sepol_genbools(map, sb.st_size, selinux_booleans_path());
+ if (ret < 0) {
+ if (errno != ENOENT && errno != EINVAL) {
+ initlog(L_VB,"Error while setting booleans: %s\n",
+ strerror(errno));
+ goto UMOUNT;
+ }
+ }
+ initlog(L_VB, "Loading security policy\n");
+ ret=security_load_policy(map, sb.st_size);
+ if (ret < 0) {
+ initlog(L_VB, "security_load_policy failed\n");
+ }
+
+UMOUNT:
+ /*umount(SELINUXMNT); */
+ if ( fd >= 0) {
+ close(fd);
+ }
+ return(ret);
+}
+
/*
* Sleep a number of seconds.
*
@@ -2599,6 +2741,7 @@
char *p;
int f;
int isinit;
+ int enforce = 0;

/* Get my own name */
if ((p = strrchr(argv[0], '/')) != NULL)
@@ -2662,6 +2805,20 @@
maxproclen += strlen(argv[f]) + 1;
}

+ if (getenv("SELINUX_INIT") == NULL) {
+ putenv("SELINUX_INIT=YES");
+ if (load_policy(&enforce) == 0 ) {
+ execv(myname, argv);
+ } else {
+ if (enforce > 0) {
+ /* SELinux in enforcing mode but load_policy failed */
+ /* At this point, we probably can't open /dev/console, so log() won't work */
+ fprintf(stderr,"Enforcing mode requested but no policy loaded. Halting now.\n");
+ exit(1);
+ }
+ }
+ }
+
/* Start booting. */
argv0 = argv[0];
argv[1] = NULL;
diff -urN sysvinit-2.86.orig/src/sulogin.c sysvinit-2.86/src/sulogin.c
--- sysvinit-2.86.orig/src/sulogin.c 2004-07-30 07:40:28.000000000 -0400
+++ sysvinit-2.86/src/sulogin.c 2005-01-03 20:30:48.746751992 -0500
@@ -27,7 +27,10 @@
#if defined(__GLIBC__)
# include <crypt.h>
#endif
-
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
+#include <selinux/get_context_list.h>
+#endif
#define CHECK_DES 1
#define CHECK_MD5 1

@@ -335,6 +338,16 @@
signal(SIGINT, SIG_DFL);
signal(SIGTSTP, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
+#ifdef WITH_SELINUX
+ if (is_selinux_enabled > 0) {
+ security_context_t* contextlist=NULL;
+ if (get_ordered_context_list("root", 0, &contextlist) > 0) {
+ if (setexeccon(contextlist[0]) != 0)
+ fprintf(stderr, "setexeccon faile\n");
+ freeconary(contextlist);
+ }
+ }
+#endif
execl(sushell, shell, NULL);
perror(sushell);

这个补丁针对的文件为init.c和sulogin.c。执行make之前确定系统里已安装了libselinux1-dev和libsepol1-dev这两个包。执行完make之后再敲两打命令:
install -o root -g root -m 755 init /sbin/
install -o root -g root -m 755 sulogin /sbin/

如果想把原来的文件备份也可以,不过要想简单地把这两个新文件拷贝到/sbin下不是可能的。

接下来修改/boot/grub/menu.lst文件,在那个kernel行后加上selinux=1 enforcing=0,至于内核,根本没有必要重新编译!改完之后重启系统,安装selinux-policy-defaule相关的包。安装成攻之后重启,看一下sestatus,再也不是disabled了吧!

:D
可是接下来的问题是如果要打开selinux的强制,把/boot/grub/menu.lst中的enforcing=0改成enforcing=1,问题就来了!这个问题哪位能解决就赐教一个,谢谢先。不过好像还是得我自己解决了!


_________________
回避问题 = 曲线救国 = 棒槌


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 绝非扯淡文章:SElinux安装并且激活permissive mode,应该是国内仅有吧
帖子发表于 : 2009-05-31 11:55 
头像

注册: 2008-11-01 13:38
帖子: 1421
送出感谢: 25
接收感谢: 4
你太强了,我是Ubuntu9.04安装好Selinux,如何激活阿?有没有简单的方法???谢谢了! :em11 :em11 :em11


_________________
新建的 ubuntu Slack 群组。欢迎大家能够来。
群组名:ubuntu1604.slack.com
由于QQ在linux桌面上有局限,故希望大家可以通过slack聊天软件。更方便的解答别人的疑问,解决自己的问题。
slack貌似无法申请加入,只能邀请加入。可以发邮箱地址私聊我,我邀请。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 绝非扯淡文章:SElinux安装并且激活permissive mode,应该是国内仅有吧
帖子发表于 : 2009-10-25 20:24 
头像

注册: 2008-03-09 22:02
帖子: 47
地址: 南京
送出感谢: 0 次
接收感谢: 0 次
KOSKERS 写道:
你太强了,我是Ubuntu9.04安装好Selinux,如何激活阿?有没有简单的方法???谢谢了! :em11 :em11 :em11



打开/etc/selinux/config

将配置改成如下
# 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:
# default - equivalent to the old strict and targeted policies
# mls - Multi-Level Security (for military and educational use)
# src - Custom policy built from source
SELINUXTYPE=ubuntu

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=1

保存重启。。。。。
不过貌似这样干network manager图标不见了。关机菜单只有退出和锁定了。貌似是权限不够。。求解 :em06


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 绝非扯淡文章:SElinux安装并且激活permissive mode,应该是国内仅有吧
帖子发表于 : 2009-11-24 11:49 

注册: 2008-06-20 15:27
帖子: 13
送出感谢: 0 次
接收感谢: 0 次
# disabled - No SELinux policy is loaded.
SELINUX=enforcing


这一行改成 SELINUX=premissive 试试看?


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译