Linux: 生成随机的MAC地址

Linux: 生成随机的MAC地址,第1张

sed -i 's@#iface eth0 inet static@pre-up ifconfig eth0 hw ether '$MAC'@g' grep -rl "#iface eth0 inet static" /etc/network/interfaces

有一批ARM板出来全都是同一个MAC地址: 08:00:27:00:01:92

这就导致获取的IP都是一样的,需要让他们启动后获取各自不一样的IP,因此每个板子都需要获得其自己的MAC地址(后三个BYTE区分身份): "08:00:27:XX:XX:XX"

用shell脚本来实现随机的MAC。

Printf random mac by 4 commands :

Target:

demo: /etc/init.d/network.sh, 添加配置的实现:

Github地址: https://github.com/kumataahh

前几天一个小伙伴发邮件问我,他在docker内部使用gdb调试时刻遇到了gdb如下报错信息

ptrace:Operation not permitted

当时我的答复是在docker create或者docker run时刻开启 万精油--privileged参数 。小伙伴的问题就此解决了。

但是事实并非如此简单

Docker借用了linux对进程设置capabilities,而其子进程继承父进程capabilites特性来完成对容器capacities的控制。Docker create和docker run参数中有下面两个参数可以对容器默认的capabilites进行修改:

--cap-add //添加某个capabilites属性 --cap-del //剔除某个默认的capabilites属性

cap-add和cap-del可以设置的参数可以通过下面链接查询到:

https://docs.docker.com/engine/reference/commandline/run/

但是这并不是问题的全部,对于上述测试程序,如果执行下面命令gdb又有告警出来

虽然依然可以调试,但是我们还是需要搞清楚上述告警的意思。地址随机化是linux一项安全特性,它允许内核进程启动每次加载库的时候都在随机化的分布在进程虚拟内存地址空间上(早期固定的库要加载到固定地方,如果固定地方被占用才加载到别地方。会造成多次加载程序,其库地址都不变。如此有安全隐患)。在gdb调试中gdb默认需要关闭linux的地址随机化功能,可以通过gdb 命令set disable-randomization off关闭。 如果在地址随机化下调试同一段程序,多次run时候可以看到它的运行地址和函数地址不一致,这没有什么太大的问题。问题可以结束一半了

关于gdb 设置地址随机化开关详情见下面链接:

http://visualgdb.com/gdbreference/commands/set_disable-randomization

当然上述告警其实也可以不通过gdb设置来完成,可以通过下面介绍的Docker参数可以达成。

Docker默认情况下为每个容器都设置了一个默认的seccom profile。一般情况下无需修改。但是docker依然支持

docker create或者docker run时候通过--security-opt seccomp=xxx参数来设置docker容器的seccomp策略。

xxx可以是一个json格式文件,里面定义了docker容器每个具体的seccomp规则。也可以是字符unconfined表示关闭默认的docker seccomp 规则。

可以通过下面命令彻底关闭docker默认seccomp引入的任何限制

docker run -it --security-opt seccomp=unconfined centos:lastes

在运行上述gdb 调试命令run一个进程,告警信息终于彻底消失了。

Docker设置的seccomp 默认profile规则可以通过如下链接查询到:

https://docs.docker.com/engine/security/seccomp/

本文就不再做详细展开了。

从Linux 2.6.23开始支持这种特性对进程能够使用的系统调用进行控制,如此可以进行一些安全性策略。sandbox就是依赖于此技术。docker梳理了Linux的系统调用,从300+个系统调用中屏蔽掉了44个系统调用,但是又最大程度的不影响正常的应用使用系统。

从Linux 2.1开始支持的特性,将超级用户的权限划分为多个组,每个进程都有一个capabilities属性,子进程从自己的父进程中基础capacities。这个特性和sudo不一样,因为sudo控制粒度太粗;而capabilities控制粒度很精细。linux有一系列的调用可以设置、查看,清除和比较进程的capabilities。可以通过:

man cap_set_flag

来查看这一系列的系统调用。而具体进程的capacities可以通过/proc/$pid/status中:

Capxxx字段看到,本文就不再展开。感兴趣的朋友可以参考

https://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7127425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存