使非root帐号能够自由使用ulimit和1024以下端口(D0分离的两个技术关键点).doc

使非root帐号能够自由使用ulimit和1024以下端口(D0分离的两个技术关键点).doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

wannian118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档