如何用脚本批量添加TACACS用户?

wen 实用脚本 3

如何用脚本批量添加TACACS用户?——从原理到实战

目录导读

  1. 为什么需要脚本批量添加TACACS用户?

    如何用脚本批量添加TACACS用户?

    • 传统手动添加的痛点
    • 脚本自动化带来的效率提升
  2. TACACS+认证核心原理回顾

    • 协议架构与用户数据库存储
    • 常见配置方式对比(CLI vs 文件注入)
  3. 脚本批量添加TACACS用户的四种方法

    • Expect脚本自动交互(适用于旧版设备)
    • Bash+CSV文件批量生成配置
    • Python + Netmiko库实现多厂商兼容
    • 直接修改TACACS服务器数据库(如RADIUS兼容模式)
  4. 实战案例:使用Python脚本批量添加500个用户

    • 准备工作:环境搭建与文件格式
    • 脚本核心代码解析
    • 执行结果验证与常见错误处理
  5. 安全与性能考量

    • 密码策略与加密存储
    • 脚本执行频率与设备负载
  6. 问答专区

    • Q1: 脚本添加用户后,是否需要重启TACACS服务?
    • Q2: 如何防止脚本重复添加已有用户?
    • Q3: 脚本能否支持不同TACACS厂商(例如Cisco、Aruba、FreeRADIUS)?

为什么需要脚本批量添加TACACS用户?

在传统企业网络中,当网络设备数量超过200台时,手动逐台执行命令添加TACACS用户无异于灾难。一位资深网络工程师曾统计:手动添加100个用户到10台核心交换机,平均耗时需要6小时,且出错率高达15%(如密码敲错、权限组名写错),而采用脚本批量添加后,同样任务可以压缩到5分钟内完成,误差率接近于零。

核心痛点

  • 多设备重复劳动:每台设备需重复相同的username命令
  • 权限不一致:手工操作容易遗漏某个设备的特殊权限组
  • 密码管理混乱:临时密码记录在纸质文档或Excel中,安全性低

脚本优势

  • 一次编写,多次复用(通过CSV、YAML等配置文件调整用户列表)
  • 自动校验:脚本可检测用户是否已存在,避免冲突
  • 支持标准化:批量推送时统一密码复杂度与加密算法

TACACS+认证核心原理回顾

TACACS+协议(Terminal Access Controller Access-Control System Plus)是Cisco等厂商广泛使用的AAA协议,其用户数据库通常存储在:

  • 本地设备Flash:通过username命令写入running-config
  • 外部TACACS服务器:如Cisco ACS、FreeRADIUS、ISE,数据库可基于LDAP或SQL

关键差异
脚本批量添加的方向不同,本文重点讲解第一种场景——通过脚本向网络设备本地配置注入用户,因为这是日常运维中最频繁的操作,第二种场景(修改TACACS服务器数据库)通常由安全团队通过API或SQL语句完成,更适合用Python结合Requests库操作。


脚本批量添加TACACS用户的四种方法

Expect脚本自动交互(适用于旧版设备)

#!/usr/bin/expect
set device "192.168.1.1"
set username "admin"
set password "cisco"
spawn ssh $username@$device
expect "Password:" { send "$password\r" }
expect "#" { send "config t\r" }
send "username user1 privilege 15 password 0 test123\r"
send "end\r"
send "write memory\r"
expect "#" { send "exit\r" }

缺点:每台设备需单独修改IP,且难以处理大量用户。

Bash+CSV文件批量生成配置(推荐)

#!/bin/bash
# prepare_users.csv格式: username,privilege,password
# 执行前先检测CSV文件是否存在
input_file="users.csv"
if [ ! -f "$input_file" ]; then
    echo "错误:用户文件不存在"
    exit 1
fi
# 循环读取每行,生成完整的配置块
while IFS=',' read -r user priv pass
do
    # 添加权限检查
    if [ "$priv" -lt 1 ] || [ "$priv" -gt 15 ]; then
        echo "警告:$user 的权限值 $priv 不在1-15范围,已跳过"
        continue
    fi
    echo "username $user privilege $priv password 0 $pass"
done < "$input_file" > output_config.txt

优点:生成纯配置文本,可手动复制粘贴或多设备批量推送。

Python + Netmiko库(多厂商兼容)

from netmiko import ConnectHandler
import csv
devices = [
    {"device_type": "cisco_ios", "ip": "192.168.1.1", "username": "admin", "password": "cisco"},
    # 可扩展多个设备
]
with open('users.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for device in devices:
        connection = ConnectHandler(**device)
        for row in reader:
            config_commands = [f"username {row['username']} privilege {row['privilege']} password 0 {row['password']}"]
            connection.send_config_set(config_commands)
            print(f"已添加用户 {row['username']} 到 {device['ip']}")
        connection.disconnect()

注意事项:需提前安装netmikoparamiko库,且CSV文件首行必须包含username,privilege,password

直接修改TACACS服务器数据库(如FreeRADIUS)

对于使用FreeRADIUS的企业,可以通过SQL语句批量插入:

INSERT INTO radcheck (username, attribute, op, value) VALUES 
('user1', 'Cleartext-Password', ':=', 'pass123'),
('user2', 'Cleartext-Password', ':=', 'pass456');

此方法需要数据库权限,适合与内部HR系统对接的自动化场景。


实战案例:使用Python脚本批量添加500个用户

准备工作

  1. 生成500个用户的CSV文件(示例生成脚本):
    for i in $(seq 1 500); do
     echo "user$i,15,random$(openssl rand -base64 8)"
    done > users.csv
  2. 安装依赖:pip install netmiko

核心脚本(含错误处理)

from netmiko import ConnectHandler
import csv, logging, sys
logging.basicConfig(filename='tacacs_add.log', level=logging.INFO)
device_params = {
    'device_type': 'cisco_ios',
    'ip': '192.168.100.1',
    'username': 'netadmin',
    'password': 'cisco123',
    'timeout': 30  # 增加超时时间
}
try:
    conn = ConnectHandler(**device_params)
except Exception as e:
    logging.error(f"连接失败: {e}")
    sys.exit(1)
with open('users.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        # 检查用户是否已存在
        check_cmd = f"show run | include username {row['username']}"
        output = conn.send_command(check_cmd)
        if row['username'] in output:
            logging.warning(f"用户 {row['username']} 已存在,跳过")
            continue
        # 批量配置
        cmd = f"username {row['username']} privilege {row['privilege']} password 0 {row['password']}"
        conn.send_config_set([cmd])
        logging.info(f"成功添加用户 {row['username']}")
conn.send_command('write memory')
conn.disconnect()
logging.info("所有用户添加完成")

验证结果

  • 在设备上执行 show users | count 可查看用户总数
  • 日志文件tacacs_add.log会记录每个用户的添加状态

安全与性能考量

安全维度 建议措施
密码加密 脚本中避免使用password 0,改用password 7secret加密命令
传输加密 使用SSH而非Telnet连接设备
权限隔离 脚本运行账号应仅具有读写本地配置的权限
日志审计 每次执行记录操作时间、设备IP、执行人(通过系统环境变量)

性能注意:如果网络设备数量超过50台,建议加入timeout=60参数,并分批执行(每批10台),避免单个设备配置延迟影响整体。


问答专区

Q1: 脚本添加用户后,是否需要重启TACACS服务?

不需要,网络设备(如Cisco IOS/ NX-OS)中的本地用户是实时生效的,无需重启任何服务,但如果修改的是外部TACACS服务器数据库(如FreeRADIUS),则需要重载radiusd -X服务或等待自动同步间隔。

Q2: 如何防止脚本重复添加已有用户?

建议在脚本中加入预检查逻辑(如案例中的show run | include username),或使用username add命令的唯一性检测,更严谨的做法是:在脚本启动时备份当前配置,一旦重复添加导致配置混乱,可一键回滚。

Q3: 脚本能否支持不同TACACS厂商(例如Cisco、Aruba、FreeRADIUS)?

完全可以,Netmiko库支持超过50种网络设备类型,只需在device_type参数中修改对应值:

  • Cisco IOS:cisco_ios
  • Aruba AOS:aruba_os
  • FreeRADIUS服务器:需通过SQL API或radclient工具(需单独编写调用库)

脚本设计时应将device_typeconfig_command作为外部变量传入,实现多厂商适配。


本文著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

抱歉,评论功能暂时关闭!