Using sudo to Delegate Privileges

By default, Cumulus Linux has two user accounts: root and cumulus. The cumulus account is a normal user and is in the group sudo.

You can add more user accounts as needed. Like the cumulus account, these accounts must use sudo to execute privileged commands.

sudo Basics

sudo allows you to execute a command as superuser or another user as specified by the security policy.

The default security policy is sudoers, which you configure in the /etc/sudoers file. Use /etc/sudoers.d/ to add to the default sudoers policy.

Use visudo only to edit the sudoers file; do not use another editor like vi or emacs.

When creating a new file in /etc/sudoers.d, use visudo -f. This option performs sanity checks before writing the file to avoid errors that prevent sudo from working.

Errors in the sudoers file can result in losing the ability to elevate privileges to root. You can fix this issue only by power cycling the switch and booting into single user mode. Before modifying sudoers, enable the root user by setting a password for the root user.

By default, users in the sudo group can use sudo to execute privileged commands. To add users to the sudo group, use the useradd(8) or usermod(8) command. To see which users belong to the sudo group, see /etc/group (man group(5)).

You can run any command as sudo, including su. You must enter a password.

The example below shows how to use sudo as a non-privileged user cumulus to bring up an interface:

cumulus@switch:~$ ip link show dev swp1
3: swp1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT qlen 500
link/ether 44:38:39:00:27:9f brd ff:ff:ff:ff:ff:ff

cumulus@switch:~$ ip link set dev swp1 up
RTNETLINK answers: Operation not permitted

cumulus@switch:~$ sudo ip link set dev swp1 up
Password:

umulus@switch:~$ ip link show dev swp1
3: swp1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT qlen 500
link/ether 44:38:39:00:27:9f brd ff:ff:ff:ff:ff:ff

sudoers Examples

The following examples show how you grant as few privileges as necessary to a user or group of users to allow them to perform the required task. Each example uses the system group noc; groups include the prefix %.

When an unprivileged user runs a command, the command must include the sudo prefix.

Category Privilege Example Command sudoers Entry
Monitoring Switch port information ethtool -m swp1 %noc ALL=(ALL) NOPASSWD:/sbin/ethtool
Monitoring System diagnostics cl-support %noc ALL=(ALL) NOPASSWD:/usr/cumulus/bin/cl-support
Monitoring Routing diagnostics cl-resource-query %noc ALL=(ALL) NOPASSWD:/usr/cumulus/bin/cl-resource-query
Image management Install images onie-select http://lab/install.bin %noc ALL=(ALL) NOPASSWD:/usr/cumulus/bin/onie-select
Package management Any apt-get command apt-get update or apt-get install %noc ALL=(ALL) NOPASSWD:/usr/bin/apt-get
Package management Just apt-get update apt-get update %noc ALL=(ALL) NOPASSWD:/usr/bin/apt-get update
Package management Install packages apt-get install vim %noc ALL=(ALL) NOPASSWD:/usr/bin/apt-get install *
Package management Upgrading apt-get upgrade %noc ALL=(ALL) NOPASSWD:/usr/bin/apt-get upgrade
Netfilter Install ACL policies cl-acltool -i %noc ALL=(ALL) NOPASSWD:/usr/cumulus/bin/cl-acltool
Netfilter List iptables rules iptables -L %noc ALL=(ALL) NOPASSWD:/sbin/iptables
Layer 1 and 2 Any LLDP command lldpcli show neighbors / configure %noc ALL=(ALL) NOPASSWD:/usr/sbin/lldpcli
Layer 1 and 2 Just show neighbors lldpcli show neighbors %noc ALL=(ALL) NOPASSWD:/usr/sbin/lldpcli show neighbors*
Interfaces Modify any interface ip link set dev swp1 {up|down} %noc ALL=(ALL) NOPASSWD:/sbin/ip link set *
Interfaces Up any interface ifup swp1 %noc ALL=(ALL) NOPASSWD:/sbin/ifup
Interfaces Down any interface ifdown swp1 %noc ALL=(ALL) NOPASSWD:/sbin/ifdown
Interfaces Up/down only swp2 ifup swp2 / ifdown swp2 %noc ALL=(ALL) NOPASSWD:/sbin/ifup swp2,/sbin/ifdown swp2
Interfaces Any IP address change ip addr {add|del} 192.0.2.1/30 dev swp1 %noc ALL=(ALL) NOPASSWD:/sbin/ip addr *
Interfaces Only set IP address ip addr add 192.0.2.1/30 dev swp1 %noc ALL=(ALL) NOPASSWD:/sbin/ip addr add *
Ethernet bridging Any bridge command brctl addbr br0 / brctl delif br0 swp1 %noc ALL=(ALL) NOPASSWD:/sbin/brctl
Ethernet bridging Add bridges and interfaces brctl addbr br0 / brctl addif br0 swp1 %noc ALL=(ALL) NOPASSWD:/sbin/brctl addbr *,/sbin/brctl addif *
Spanning tree Set STP properties mstpctl setmaxage br2 20 %noc ALL=(ALL) NOPASSWD:/sbin/mstpctl
Troubleshooting Restart switchd systemctl restart switchd.service %noc ALL=(ALL) NOPASSWD:/usr/sbin/service switchd *
Troubleshooting Restart any service systemctl cron switchd.service %noc ALL=(ALL) NOPASSWD:/usr/sbin/service
Troubleshooting Packet capture tcpdump %noc ALL=(ALL) NOPASSWD:/usr/sbin/tcpdump
Layer 3 Add static routes ip route add 10.2.0.0/16 via 10.0.0.1 %noc ALL=(ALL) NOPASSWD:/bin/ip route add *
Layer 3 Delete static routes ip route del 10.2.0.0/16 via 10.0.0.1 %noc ALL=(ALL) NOPASSWD:/bin/ip route del *
Layer 3 Any static route change ip route * %noc ALL=(ALL) NOPASSWD:/bin/ip route *
Layer 3 Any iproute command ip * %noc ALL=(ALL) NOPASSWD:/bin/ip
Layer 3 Non-modal OSPF cl-ospf area 0.0.0.1 range 10.0.0.0/24 %noc ALL=(ALL) NOPASSWD:/usr/bin/cl-ospf