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格式


下面是如何使用

一. 将自己添加到sudoers,可以直接编辑/etc/sudoers也可以是用visudo或者其他程序,这里直接编辑文件

二. 使用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