Ich habe einen Anwendungsfall, in dem ich einen Auftragnehmer habe, der ssh- und sudo-Zugriff auf einen Server benötigt, aber nicht auf unsere anderen Server. Alle unsere Server werden von Chef verwaltet, und wir verwenden Databags, um jeden Benutzer zu konfigurieren. Irgendwelche Tipps für den besten Weg, dies zu erreichen?Verwendung von Chef, Einschränkung des Benutzerzugriffs auf bestimmte Server/Umgebungen
Antwort
Wie immer gibt es eine große Vielfalt an Möglichkeiten :-) Here is, wie wir pro Benutzer Zugriff auf Knoten basierend auf einem users
Datenbeutel konfigurieren.
- Alle Benutzer mit
group: sysadmin
werden alle Knoten mit sudo Berechtigungen automatisch zugewiesen. - Alle anderen Benutzer werden aufgrund ihrer Zuordnung zu bestimmten Hosts hinzugefügt. Die
users
Datenbeutel wird für Elemente gesucht, die einen Eintrag fürnode['fqdn']
im"nodes"
Schlüssel des Daten Beutel enthalten:
{
"id": "a-srv123-admin",
...
"nodes": {
"srv123.typo3.org": {
"sudo": "true"
}
}
}
Um einen Benutzer von allen Knoten zu entfernen, können action: remove
eingestellt werden auf höchstem Niveau:
{
"id": "a-user-to-remove",
"action": "remove"
}
um einen Benutzer von einem bestimmten Knoten zu entfernen, kann action: remove
eingestellt werdenauf der Knotenebene:
{
"id": "a-user-to-remove",
...
"nodes": {
"srv123.typo3.org": {
"action": "remove"
}
}
}
Die implementation of this (nicht sehr sauber in Wahrheit, leider), sucht nur für alle mit dem node[fqdn]
assoziiert Benutzer:
node_attribute = "fqdn"
log "Searching for users associated with node #{node[node_attribute]}"
begin
users = search(users_databag_name, "nodes:#{node[node_attribute]}")
rescue Net::HTTPServerException
Chef::Log.warn "Searching for users in the 'users' databag failed, search for users associated with node '#{node[node_attribute]}'"
users = {}
end
users.each do |u|
node_options = u['nodes'][node[node_attribute]]
Chef::Log.info "Got node options: #{node_options}"
if u['action'] == "remove" || node_options['action'] == "remove"
user u['username'] ||= u['id'] do
action :remove
end
else
# snip...
# Create user object.
user u['username'] do
uid u['uid'] if u['uid']
gid u['gid'] if u['gid']
shell u['shell']
comment u['comment']
password u['password'] if u['password']
supports manage_home: true
home home_dir
action u['action'] if u['action']
end
# sudo management
if node_options['sudo'] == "true"
sudo u['username'] do
nopasswd true
user u['username']
end
else
sudo u['username'] do
action :remove
end
end
end
end
EDIT: Seien Sie gewarnt, dass jeder Benutzer mit Der Zugriff auf das Client-Zertifikat von Chef kann Daten basierend auf den Daten des Clients abfragen. Dies kann Kennwörter enthalten, die in den Attributen anderer Knoten gespeichert sind. RBAC oder Cheftresor kann dies mildern.