![我的应用程序何时需要以特权运行?](https://linux22.com/image/1085163/%E6%88%91%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BD%95%E6%97%B6%E9%9C%80%E8%A6%81%E4%BB%A5%E7%89%B9%E6%9D%83%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
确保应用程序不易受到攻击的一种方法是确保它以所需的最小权限运行(最好是用户模式)。
我通常只使用 为 Windows 编程.NET framework
,但最近一直在尝试使用 Go 进行 Web 应用程序开发。我是 Ubuntu(以及 Linux)的新手,所以我想知道我需要做什么才能确保我的服务器应用程序使用尽可能低的权限?
我认为不允许我的程序写入系统文件夹是一种方法,但是其他方法是什么?
答案1
访问家外的文件夹需要一些提升的权限,因此最好将所有文件保存在家里。
$ ls -l /~$ ls -l /
total 152
drwxr-xr-x 2 root root 12288 May 28 08:29 bin
drwxr-xr-x 4 root root 4096 May 26 09:54 boot
drwxr-xr-x 3 root root 4096 May 5 10:22 build
drwxr-xr-x 2 root root 4096 Apr 8 2014 cdrom
drwxr-xr-x 15 root root 4540 May 27 12:35 dev
drwxr-xr-x 208 root root 12288 May 28 08:29 etc
drwxr-xr-x 5 root root 4096 Dec 23 09:43 home
lrwxrwxrwx 1 root root 32 Apr 8 2014 initrd.img -> boot/initrd.img-3.2.0-23-generic
drwxr-xr-x 28 root root 4096 May 22 08:38 lib
drwxrwxrwx 2 root root 12288 May 7 13:20 lib32
drwxr-xr-x 2 root root 4096 Apr 14 08:28 lib64
lrwxrwxrwx 1 root root 36 Feb 25 14:00 libnss3.so -> /usr/lib/x86_64-linux-gnu/libnss3.so
drwx------ 2 root root 16384 Dec 23 09:43 lost+found
drwxr-xr-x 7 root root 4096 May 13 18:17 media
drwxr-xr-x 3 root root 4096 Dec 23 09:43 mnt
drwxr-xr-x 19 root root 4096 May 8 08:05 opt
dr-xr-xr-x 308 root root 0 May 26 13:35 proc
drwx------ 23 root root 4096 May 20 08:53 root
drwxr-xr-x 32 root root 1200 May 28 08:29 run
drwxr-xr-x 2 root root 12288 May 28 08:29 sbin
drwxr-xr-x 2 root root 4096 Mar 5 2012 selinux
drwxr-xr-x 2 root root 4096 Apr 7 2014 srv
drwxr-xr-x 13 root root 0 May 26 13:35 sys
drwxr-xr-x 3 root root 4096 Dec 23 09:43 timeshift
drwxrwxrwt 22 root root 24576 May 29 13:52 tmp
drwxr-xr-x 13 root root 4096 Jun 20 2014 usr
drwxr-xr-x 15 root root 4096 May 22 12:52 var
lrwxrwxrwx 1 root root 29 Apr 8 2014 vmlinuz ->
如您所见,所有这些目录都归 root 所有,并且要使用这些目录,您需要更多权限,除非您的主目录(由此代表~
并可从/home/username
此处访问)是您作为普通用户进行游乐场的唯一场所。
答案2
首先,我不确定这里是否是提问的正确地方,因为这是关于 Ubuntu 的,但您的问题是一个一般的 Unix/Linux 编程问题。无论如何,情况如下:
- 了解 Unix/Linux 权限
您说“(首选用户模式)”让我觉得您可能搞混了。“用户模式”与“内核模式”是操作系统编程的概念。这归结为 CPU 特权,在上下文切换到内核模式后,一些内核例程会执行其工作。它们可以看到其他 CPU 寄存器并可以访问特权 CPU 指令。这就是您的内核和驱动程序运行的地方,除非您成为内核/驱动程序开发人员,否则您永远无法访问它。
所有常规操作均发生在用户模式下。
这里有“root”,即具有提升权限的超级用户和“普通”用户。此外,用户可以是具有不同权限的多个组的成员。
看:Linux 权限简介和真实有效的身份证件或者一本关于 Unix/Linux 编程的书(例如 Eric S. Raymond 的《Unix 编程艺术》——我知道他的《Unix 网络编程》,很经典)
- 不使用任何权限或使用后删除它们
您正在编写网络应用程序?如果您想绑定到低编号端口(<1024 IMHO),您需要 root 权限。如果您使用 C 语言编写代码,使用常规 POSIX API,您甚至可以在终端中输入“man function”(即“man bind”)。应该会告诉您哪些操作需要权限。或者反复试验。这取决于您想做什么。有很多事情不需要提升权限。因此,您可以以用户身份启动程序,甚至可以创建一个组成员身份比默认 Ubuntu 用户(即“sudoers”等)更少的新用户。如果您做需要 root 权限,您可以在使用后删除它们。例如,许多服务器都是“setuid root”守护进程。它们以用户 ID root 启动,执行需要提升权限的操作,然后调用“setuid”来更改其用户 ID(即删除权限)。请参阅GNU C 库:Setuid 程序示例
无论如何,我推荐一本关于这个主题的书。你也可以在 Google 上搜索“unix security slides”,会找到一些来自 Unis 的不错的内容(遗憾的是,我所在大学的那些内容不对外公开)。