- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使非root帐号能够自由使用ulimit和1024以下端口(D0分离的两个技术关键点)
起因是gaobo问到我们部门如何进行普通非root帐号如何进行ulimit的设置,告知是用root修改后再su成普通用户进行启动。也就是说,这方面并没有进行技术上的改进工作。而且还要部门老大亲自过问,相当汗颜,故周末在家进行探究。
ulimit解决问题当时确认的有3个方法,
使用root启动一个进程,然后设置好ulimit,再改其uid,euid,再启动真实服务进程,把环境等设置继承下来,这个想法由tender提出并实现完毕。
修改bash代码,进行ulimit的默认值修改,实验后确认失败。原因是接口的确在bash处,但逻辑判断在内核,bash仅仅是单纯的接口。
直接修改内核代码,修改其限制代码。
后决定直接修改内核代码,从bash的代码中,得知使用setrlimit()函数作为系统调用函数,在内核代码中以setrlimit搜索,发现最类似函数为sys_setrlimit(),而且在/kernel/sys.c中,估计和系统调用,遂进入观察
asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim)
{
struct rlimit new_rlim, *old_rlim;
int retval;
if (resource = RLIM_NLIMITS)
return -EINVAL;
if(copy_from_user(new_rlim, rlim, sizeof(*rlim)))
return -EFAULT;
if (new_rlim.rlim_cur new_rlim.rlim_max)
return -EINVAL;
old_rlim = current-signal-rlim + resource;
if ((new_rlim.rlim_max old_rlim-rlim_max)
!capable(CAP_SYS_RESOURCE))
return -EPERM;
if (resource == RLIMIT_NOFILE new_rlim.rlim_max NR_OPEN)
return -EPERM;
retval = security_task_setrlimit(resource, new_rlim);
if (retval)
return retval;
task_lock(current-group_leader);
*old_rlim = new_rlim;
task_unlock(current-group_leader);
if (resource == RLIMIT_CPU new_rlim.rlim_cur != RLIM_INFINITY
(cputime_eq(current-signal-it_prof_expires, cputime_zero) ||
new_rlim.rlim_cur = cputime_to_secs(
current-signal-it_prof_expires))) {
unsigned long rlim_cur = new_rlim.rlim_cur;
cputime_t cputime;
if (rlim_cur == 0) {
/*
* The caller is asking for an immediate RLIMIT_CPU
* expiry. But we use the zero value to mean it was
* never set. So lets cheat and make it one second
* instead
*/
rlim_cur = 1;
}
cputime = secs_to_cputime(rlim_cur);
read_lock(tasklist_lock);
spin_lock_irq(current-sighand-siglock);
set_process_cpu_timer(current, CPUCLOCK_PROF,
cputime, NULL);
spin_unlock_irq(current-sighand-siglock);
read_unlock(tasklist_lock);
}
return 0;
}
可以看到,红字部分有比较明显的痕迹,首先第一个条件是判断增加ulimit的情况,第二个条件不大清楚,所以去看看
文档评论(0)