köra virsh som non-root, check för kvm i nagios

Trädvy Permalänk
Medlem
Plats
Hudiksvall
Registrerad
Okt 2004

köra virsh som non-root, check för kvm i nagios

Hej,

Jag ska sätta upp lite checks från nagios via NRPE, och behöver ha möjlighet att köra virsh list utan sudo och få rätt output.

Idag får jag bara
Direkt från host:
[xxxxx@xxxxxx]$ virsh list
Id Name State
----------------------------------------------------

Via NRPE:
root@nagios:/etc/apache2/conf-enabled# /usr/lib/nagios/plugins/check_nrpe -H 172.16.31.150 -c virt_check_kvm
Unknown guests

Är det nån av er linuxgurus som har nån koll på vad jag behöver göra för att lösa detta?

Kör Centos 7 på denna host och den hostar 5-6 VM's.

jag har försökt med polkit för att lösa det men får det inte riktigt att fungera, och jag vågar inte ändra i någon configfil för libvirtd heller för att inte fucka upp nått eftersom det är en server som är viktig i övervakning samt management-sammanhang.

Hur göra?

..:: Workstation ::.. ..:: Asus P8Z77-v LX ::.. ..:: MSI GTX1060 6GB ::.. ..:: i5 3450 Ivy Bridge /w Antec KÜHLER H2O 620 Sluten Vattenkylning ::.. ..:: Corsair 16GB DDR3 600MHz/CL9/VENG ::.. ..:: NoName 650W ::.. ..:: Dell 24" 2408WFP ::.. ..:: Server ::.. ..:: AMD ..:: FX-8320 ::.. ..:: 16GB ::.. ..:: XFX HD6450 ::.. ..::250GB SSD Samsung 840 EVO::.. ..:: 3x 2TB wd black ::.. ..:: VCP6-DCV ::.. ..:: vmware esxi 6.7 ::..

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Om virsh list visar dina vm som root men inte som din användare så beror det troligen på att virsh listar maskinerna som din användare kör, inte system vm. Testa att köra
virsh -c qemu:///system list

Jag antar att du kör med qemu backend.
Jag har aldrig använt nagios och vet inte hur det funkar.

Trädvy Permalänk
Medlem
Plats
Hudiksvall
Registrerad
Okt 2004

Frågan är då med vilken användare NRPE exekverar mitt skript. undrar om det då räcker om jag ändrar i kodsnutten till just det du skriver där uppe.

..:: Workstation ::.. ..:: Asus P8Z77-v LX ::.. ..:: MSI GTX1060 6GB ::.. ..:: i5 3450 Ivy Bridge /w Antec KÜHLER H2O 620 Sluten Vattenkylning ::.. ..:: Corsair 16GB DDR3 600MHz/CL9/VENG ::.. ..:: NoName 650W ::.. ..:: Dell 24" 2408WFP ::.. ..:: Server ::.. ..:: AMD ..:: FX-8320 ::.. ..:: 16GB ::.. ..:: XFX HD6450 ::.. ..::250GB SSD Samsung 840 EVO::.. ..:: 3x 2TB wd black ::.. ..:: VCP6-DCV ::.. ..:: vmware esxi 6.7 ::..

Trädvy Permalänk
Medlem
Plats
Hudiksvall
Registrerad
Okt 2004

Jag får då en fråga om authentication name och password för att komma åt detta.

Det är just detta jag vill komma runt, men också utan att det ska bli sämre rent säkerhetsmässigt.

Det jag behöver är egentligen bara RO-access.

..:: Workstation ::.. ..:: Asus P8Z77-v LX ::.. ..:: MSI GTX1060 6GB ::.. ..:: i5 3450 Ivy Bridge /w Antec KÜHLER H2O 620 Sluten Vattenkylning ::.. ..:: Corsair 16GB DDR3 600MHz/CL9/VENG ::.. ..:: NoName 650W ::.. ..:: Dell 24" 2408WFP ::.. ..:: Server ::.. ..:: AMD ..:: FX-8320 ::.. ..:: 16GB ::.. ..:: XFX HD6450 ::.. ..::250GB SSD Samsung 840 EVO::.. ..:: 3x 2TB wd black ::.. ..:: VCP6-DCV ::.. ..:: vmware esxi 6.7 ::..

Trädvy Permalänk
Medlem
Plats
Hudiksvall
Registrerad
Okt 2004

NRPE använder nrpe som user för att exekvera mitt skript som jag har.
Checken ser ut som följande:
#!/bin/sh
# check_kvm - Check that a virtual machine is running. Written by Karl Rink <krink@csun.edu>
#
#----------------------------------------------------------------------
# COPYRIGHT : 12.2010 California State University, Northridge
#
# AUTHOR : Karl Rink
#
# BELONGS TO : Qemu/Kvm Nagios Integration
#
# DESCRIPTION : Runs "virsh list" and returns the available vms
#
# $Revision: 1.0 $
#
# Permission to use, copy, modify, distribute, and sell this software and its documentation for any
# purpose is hereby granted without fee, provided that the above copyright notice appear in all copies
# and that both that copyright notice and this permission notice appear in supporting documentation.
#
# The above copyright notice and this permission notice shall be included in all copies or substantial
# portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
#LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
#NO EVENT SHALL THE AUTHOR OR SUSE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
#ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
#USE OR OTHER DEALINGS IN THE SOFTWARE.
#----------------------------------------------------------------------
# Install: Put this script in nagios client directory libexec/check_kvm As a nagios nrpe plugin, add the
# following line to your client nrpe.cfg command[virt_check_kvm]=/opt/nagios/libexec/check_kvm No sudo
# is necessary if you simply add nagios user to the libvirt group libvirtd:x:118:nagios
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH

LIST=$(virsh list --all | sed '1,2d' | sed '/^$/d'| awk '{print $2":"$3 $4}')

if [ ! "$LIST" ]; then
EXITVAL=3 #Status 3 = UNKNOWN (orange)
echo "Unknown guests"
exit $EXITVAL
fi

OK=0
WARN=0
CRIT=0
NUM=0
for host in $(echo $LIST)
do
name=$(echo $host | awk -F: '{print $1}')
state=$(echo $host | awk -F: '{print $2}')
NUM=$(expr $NUM + 1)
case "$state" in
running|blocked) OK=$(expr $OK + 1) ;;
paused) WARN=$(expr $WARN + 1) ;;
shutdown|shut*|crashed) CRIT=$(expr $CRIT + 1) ;;
*) CRIT=$(expr $CRIT + 1) ;;
esac
done
if [ "$NUM" -eq "$OK" ]; then
EXITVAL=0 #Status 0 = OK (green)
fi
if [ "$WARN" -gt 0 ]; then
EXITVAL=1 #Status 1 = WARNING (yellow)
fi
if [ "$CRIT" -gt 0 ]; then
EXITVAL=2 #Status 2 = CRITICAL (red)
fi
echo hosts:$NUM OK:$OK WARN:$WARN CRIT:$CRIT - $LIST
exit $EXITVAL

Jag är osäker på är hur jag skapar RO-access utan att behöva autentisera mig mot backend som användaren nrpe.

..:: Workstation ::.. ..:: Asus P8Z77-v LX ::.. ..:: MSI GTX1060 6GB ::.. ..:: i5 3450 Ivy Bridge /w Antec KÜHLER H2O 620 Sluten Vattenkylning ::.. ..:: Corsair 16GB DDR3 600MHz/CL9/VENG ::.. ..:: NoName 650W ::.. ..:: Dell 24" 2408WFP ::.. ..:: Server ::.. ..:: AMD ..:: FX-8320 ::.. ..:: 16GB ::.. ..:: XFX HD6450 ::.. ..::250GB SSD Samsung 840 EVO::.. ..:: 3x 2TB wd black ::.. ..:: VCP6-DCV ::.. ..:: vmware esxi 6.7 ::..

Trädvy Permalänk
Medlem
Plats
Solna
Registrerad
Mar 2005

Jag har sutt och testat lite, och med vanliga "kommandot" får du inte komma åt libvirt som vanlig användare (trodde jag, läs vidare). Observera att du behöver ange --connect qemu:///system (eller -c) om du kör virsh som vanlig användare då den annars går lokalt mot session.

[root@kvm01 ~]# id uid=0(root) gid=0(root) groups=0(root) [root@kvm01 ~]# virsh list --all Id Name State ---------------------------------------------------- - web01 shut off - web02 shut off [ansible@kvm01 ~]$ id uid=1000(ansible) gid=1000(ansible) groups=1000(ansible) [ansible@kvm01 ~]$ virsh --connect qemu:///system list --all error: failed to connect to the hypervisor error: authentication failed: no agent is available to authenticate

Jag hittade denna tråd denna tråd som jag misstänker att du såg angående policykit (som libvirt använder för auth som default i centos7 - mer info här). Detta tillåter din användare att göra allting via libvirt, motsvarande en "rw-socket".

[root@kvm01 ~]# cat /etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && subject.user == "ansible") { return polkit.Result.YES; polkit.log("action=" + action); polkit.log("subject=" + subject); } }); [ansible@kvm01 ~]$ virsh --connect qemu:///system list --all Id Name State ---------------------------------------------------- 6 web01 running 7 web02 running

Däremot är jag inte alls särskilt förtjust i att en användare som endast används för monitorering plötsligt skulle få stänga av virtuella maskiner.

[ansible@kvm01 ~]$ virsh --connect qemu:///system destroy web02 Domain web02 destroyed

Jag kikade vidare och såg att det fanns en policy som hette org.libvirt.unix.monitor som istället motsvarar en "ro-socket" vilket låter betydligt mer intressant. Denna verkar vara tillåten för alla som default

Om vi lägger på -r växeln i virsh-kommandot så ansluter man istället readonly. Eftersom "ro-socketen" tillåts för alla så går kommandot igenom. Nedan kommando körs alltså utan att ha skapat några regler eller gjort några modifieringar i huvudtaget.

[ansible@kvm01 ~]$ virsh -r -c qemu:///system list --all Id Name State ---------------------------------------------------- 6 web01 running 8 web02 running

När jag kör ditt script som vanlig användare utan att ändra någonting:

[ansible@kvm01 ~]$ ./check_kvm.sh error: failed to connect to the hypervisor error: no valid connection error: Cannot create user runtime directory '/run/user/0/libvirt': Permission denied Unknown guests

Och om vi byter ut rad 34 med våra andra växlar från

LIST=$(virsh list --all | sed '1,2d' | sed '/^$/d'| awk '{print $2":"$3 $4}')

till

LIST=$(virsh -r -c qemu:///system list --all | sed '1,2d' | sed '/^$/d'| awk '{print $2":"$3 $4}')

... så verkar scriptet fungera mycket bättre:

[ansible@kvm01 ~]$ ./check_kvm.sh hosts:2 OK:2 WARN:0 CRIT:0 - web01:running web02:running

Så för att sammanfatta det hela så behöver du bara modifiera hur scriptet kör virsh-kommandot. Den behöver ansluta sig mot qemu:///system och göra det readonly.

Trädvy Permalänk
Medlem
Plats
Hudiksvall
Registrerad
Okt 2004

@jagardaniel:

Som sagt är inte heller alls förtjust i att en användare har rättigheter att göra allt. Så de var just ro rättigheterna jag ville ha!

Fan så glad jag blir!

Tack som satan! Ska testa det asap när ja kommer på jobbet på måndag!

Kanske testar det redan nu bara för att se om de funkar fint!

Så får ja helt enkelt ta och plocka bort alla rättigheter jag gett hit och dit. De lär ja göra oavsett. Helt galet att en växel va lösningen. Sjukt irriterande att ja inte kommit fram till de själva men men så är livet

Återkommer med resultatet
//tobbe

..:: Workstation ::.. ..:: Asus P8Z77-v LX ::.. ..:: MSI GTX1060 6GB ::.. ..:: i5 3450 Ivy Bridge /w Antec KÜHLER H2O 620 Sluten Vattenkylning ::.. ..:: Corsair 16GB DDR3 600MHz/CL9/VENG ::.. ..:: NoName 650W ::.. ..:: Dell 24" 2408WFP ::.. ..:: Server ::.. ..:: AMD ..:: FX-8320 ::.. ..:: 16GB ::.. ..:: XFX HD6450 ::.. ..::250GB SSD Samsung 840 EVO::.. ..:: 3x 2TB wd black ::.. ..:: VCP6-DCV ::.. ..:: vmware esxi 6.7 ::..

Trädvy Permalänk
Medlem
Plats
Hudiksvall
Registrerad
Okt 2004

Funkade fint det där!

Jag la säkert ner 6h på att hitta en lösning, osså var det en jävla växel.

Det visar att virsh/libvirt/KVM är helt klart förbannat avancerat, även om det här var en enkel grej att göra.

Inget superfan av det faktiskt. Jag föredrar nog vmware trots allt, men vad gör man då när majoriteten av maskiner är linux, samt att vår cloudplattform är baserad på KVM. då lär man lära sig det.

Tack så mycket för hjälpen!

..:: Workstation ::.. ..:: Asus P8Z77-v LX ::.. ..:: MSI GTX1060 6GB ::.. ..:: i5 3450 Ivy Bridge /w Antec KÜHLER H2O 620 Sluten Vattenkylning ::.. ..:: Corsair 16GB DDR3 600MHz/CL9/VENG ::.. ..:: NoName 650W ::.. ..:: Dell 24" 2408WFP ::.. ..:: Server ::.. ..:: AMD ..:: FX-8320 ::.. ..:: 16GB ::.. ..:: XFX HD6450 ::.. ..::250GB SSD Samsung 840 EVO::.. ..:: 3x 2TB wd black ::.. ..:: VCP6-DCV ::.. ..:: vmware esxi 6.7 ::..