sudodev
sudodev
是学姐@iSpeller在创建的一个C语言项目,旨在当特定设备(U盘)插入电脑时使用sudo
而不需要使用密码。项目地址sudodev。
学姐在贴吧发贴介绍后,在上个周五20151106我看了一遍学姐的代码,发现原理也很简单,刚好用C++练手,就在上周六,在给学姐报issue的同时,自己也动手用C++写了一个同名项目sudodev。
当天就基本成型,期间也和学姐通过issue交流。今天,试了一下,可以使用了,顺便加了一段限制log大小的代码。
下面说说原理
通过特定设备的UUID将特定的用户和特权文件关联起来,而特权文件又依赖于sudo
的Drop-In支持,当特定设备接入时,自动产生特权文件,这时sudo
监测到这个特权文件,并读取其内容后,特定设备关联的特定用户就不需要密码了。
Q:那么如何将特定设备和特定用户关联起来的呢?
A:是通过一个daemon)监控设备列表的变化,如果特定设备接入了电脑,那么daemon会生成特权文件,而该用户同时也是dameon所创建组的成员,这样就相当与这个用户也获得了特权。
愿意了解详情的同学请直接看源码,不愿意了解的同学看到到这儿就可以了。
另外,由于通过设备的UUID来筛选外部设备,目前sudodev仅支持最常用的两种fstab格式
- 分区格式,如: /dev/sda1
- UUID格式,如:UUID=2014-10-07-01
下面是如何使用
一. 将自己添加到sudoers
,可以直接编辑/etc/sudoers
也可以是用visudo
或者其他程序,这里直接编辑文件
切换到root并切换到
/etc
目录下
给
sudoers
增加写权限chmod u+w sudoers
以openSUSE Tumbleweed以及用户angel为例,修改
sudoers
,修改后看起来是下面这样。
其中angel ALL=(ALL) ALL
是添加的,并且#Defaults targetpw
中的’#‘是也是添加的,到这一步这样,angel输入sudo
只需要输入自己的密码就可以了#Defaults targetpw # ask for the password of the target user i.e. root ## ## User privilege specification ## root ALL=(ALL) ALL angel ALL=(ALL) ALL
去掉
sudoers
文件的写权限chmod u-w sudoers
编译源码,运行
sdevd
这是会有一个新的组sdevuser
被创建,需要将用户angel加入到这个组中usermod -a -G sdevuser angel
二. 使用sdev_ctl
来添加或删除特定设备
三. 退出root登录
注意,在添加用户组后,可能需要重新登录
下面是使用例子
插入特定设备时
angel@Chameleon:~> id angel
uid=1001(angel) gid=100(users) groups=100(users),1000(vboxusers),1003(sdevuser)
angel@Chameleon:~> sudo -i
⚡ ⮀ ~ ⮀ bash
Chameleon:~ # whoami
root
Chameleon:~ # cat /etc/sdev.conf
0ECA1B70CA1B5377Chameleon:~ #
拔出特定设备时
angel@Chameleon:~> sudo -i
angel's password:
Sorry, try again.
angel's password:
⚡ ⮀ ~ ⮀ cat /etc/sdev.conf
0ECA1B70CA1B5377 ⚡ ⮀ ~ ⮀
再看看log
tail -n 10 /var/log/sdevd.log
0ECA1B70CA1B5377 granted privilege!
Dropped privilege!
4E36250D3624F79B granted privilege!
Dropped privilege!
Cought signal 15 exit...
Dropped privilege!
0ECA1B70CA1B5377 granted privilege!
Dropped privilege!
0ECA1B70CA1B5377 granted privilege!
Dropped privilege!
以上
2015-11-16 更新。
前天,把以前写的fakesu
的代码完善了下。其实这货也可以像上面的sudodev
一样指定用户,但是和su
不同的是,指定的用户可以不用密码。 代码放在https://github.com/abbycin/bin/blob/dev/Misc/su.cpp