Linux:sudo 1.8.23 升级到 1.9.5p2

sudo 1.8.23 升级到 1.9.5p2

近期sudo的官网爆出了一个重大的漏洞:任何本地用户,无需身份验证(密码),也能获得root权限。
具体的描述大家可以到官网去看一下:Buffer overflow in command line unescaping
在这里插入图片描述

解决这个漏洞的最好办法,就是将sudo升级到1.9.5p2或以上的版本,那么下面分享一下如何升级。
sudo 1.9.5p2

  • 单机升级
    升级脚本
#!/bin/bash

#检查是否有gcc编译
check=$(yum list installed |grep -E  "gcc\.x86_64|gcc\-c\+\+\.x86_64|libgcc\.x86_64"|wc -l)
[[ ${check} -lt 3 ]] && echo "环境缺少gcc,请安装 gcc.x86_64 gcc-c++.x86_64 gcc-c++.x86_64 后再次执行此脚本。" && exit

#备份sudo相关文件
[[ -d /etc/bak_sudo ]] || mkdir /etc/bak_sudo
find /etc/ -maxdepth 1 -name "sudo*" -exec cp -r {
    
    } /etc/bak_sudo/ \;

#备份两个文件,后面升级失败的话,可以回退这个两个文件即可
cp /usr/bin/sudo /usr/bin/sudo_bak_182                          
cp -r /usr/libexec/sudo /usr/libexec/sudo_bak_182

#编译安装新的sudo
tar -xf sudo-1.9.5p2.tar.gz
cd sudo-1.9.5p2/
./configure --prefix=/opt/sudo  --libexecdir=/usr/libexec  --with-secure-path  --with-all-insults  --with-env-editor  --docdir=/usr/share/doc/sudo-1.9.5p2 --with-passprompt="[sudo] password for %p: " 
make && make install

#替换旧的版本的库文件和二进制命令
ln -sfv libsudo_util.so.0.0.0 /usr/libexec/sudo/libsudo_util.so.0
ln -sfv /opt/sudo/bin/sudo /usr/bin/

回滚脚本(如果升级后sudo不可用,可先回滚)

#!/bin/bash
mv /usr/bin/sudo /usr/bin/sudo_bak_195 
mv /usr/libexec/sudo /usr/libexec/sudo_bak_195
mv /usr/bin/sudo_bak_182  /usr/bin/sudo 
mv /usr/libexec/sudo_bak_182 /usr/libexec/sudo
  • 批量升级
    如果你面对的是一个主机群,那么可以使用ansible进行批量升级,下面是以role的形式编排了剧本。

目录结构

[root@tomcat-1 ansible]# tree roles/
roles/
├── rollback_sudo.yaml
├── update_sudo
│   ├── defaults
│   │   └── main.yaml
│   ├── files
│   │   └── sudo-1.9.5p2.tar.gz
│   └── tasks
│       ├── install.yaml
│       └── main.yaml
└── update_sudo.yaml

4 directories, 6 files

defaults/main.yaml

package_name: sudo-1.9.5p2.tar.gz

tasks/main.yaml

---
- import_tasks: install.yaml

tasks/install.yaml

---
- name: 创建sudo备份文件目录 /etc/bak_sudo
  file:
    path: /etc/bak_sudo
    state: directory

- name: 备份sudo相关文件
  shell:
    cmd: "find /etc/ -maxdepth 1 -name \"sudo*\" -exec cp -r {} /etc/bak_sudo/ \\;"

- name: 备份库文件 /usr/libexec/sudo
  shell:
    cmd: cp -r /usr/libexec/sudo /usr/libexec/sudo_bak_182

- name: 备份二进制文件 /usr/bin/sudo
  shell:
    cmd: cp /usr/bin/sudo /usr/bin/sudo_bak_182

- name: 创建安装目录
  file:
    path: /opt/update_sudo
    state: directory

- name: 解压tar包
  unarchive:
    src: "{
    
    { package_name }}"
    dest: /opt/update_sudo/

- name: 编译
  shell:
    cmd: "./configure --prefix=/opt/sudo  --libexecdir=/usr/libexec  --with-secure-path  --with-all-insults  --with-env-editor  --docdir=/usr/share/doc/sudo-1.9.5p2 --with-passprompt=\"[sudo] password for %p: \" "
    chdir: /opt/update_sudo/sudo-1.9.5p2

- name: 安装
  shell:
    cmd: make && make install
    chdir: /opt/update_sudo/sudo-1.9.5p2

- name: 制作库软连接
  shell:
    cmd: ln -sfv libsudo_util.so.0.0.0 /usr/libexec/sudo/libsudo_util.so.0
    chdir:  /opt/update_sudo/sudo-1.9.5p2

- name: 制作命令软连接,覆盖旧版sudo命令
  shell:
    cmd: ln -sfv /opt/sudo/bin/sudo /usr/bin/
- name: 安装完成后,检查版本
  shell:
    cmd: "sudo -V | grep \"Sudo version\""
  register: sudo_out

- name: 显示sudo版本
  debug:
    var: sudo_out
    verbosity: 0

update_sudo.yaml

---
- name: 升级sudo至1.9.5p2
  hosts: xxx
  roles:
  - update_sudo

准备好以上的文件之后,使用ansible-playbook命令执行update_sudo.yaml文件即可。

当然,如果升级失败导致sudo命令不可用,可以执行回滚的playbook。
rollback_sudo.yaml

---
- name: 回滚sudo版本至1.8.23
  hosts: xxx
  tasks:
  - name: 重命名当前库文件
    shell: mv /usr/libexec/sudo /usr/libexec/sudo_bak_195

  - name: 重命名当前二进制命令
    shell: mv /usr/bin/sudo /usr/bin/sudo_bak_195

  - name: 还原1.8.23的库文件
    shell:
      cmd: mv /usr/libexec/sudo_bak_182 /usr/libexec/sudo

  - name: 还原1.8.23的二进制命令
    shell: mv /usr/bin/sudo_bak_182 /usr/bin/sudo

  - name: 检查回退版本是否成功
    shell:
      cmd: "sudo -V | grep \"Sudo version\""
    register: sudo_out

  - name: 显示当前sudo版本
    debug:
      var: sudo_out
      verbosity: 0

猜你喜欢

转载自blog.csdn.net/rookie23rook/article/details/113682835