Мне нужно автоматическое задание для выполнения вызовов REST API для Foreman, и я бы предпочел не потрудитесь создать для него учетную запись - а затем навсегда сохранить пароль.
Однако, похоже, у Формана есть только «все или ничего» - если для чего-то требуется аутентификация (:login: true
), то он потребуется для все.
Так ли это на самом деле, или внешний вид обманчив, и Форману можно сказать, чтобы он разрешил анонимный поиск и просмотр хоста, при этом все еще требуя аутентификации для любых изменения?
Хорошо, оказывается, Foreman поддерживает доступ типа OAuth1, что немного (или даже любой) лучше, чем просто статическое имя пользователя / пароль. Хуже того, если вы не примете особые меры, сопоставив такой доступ непривилегированной учетной записи, соединения, использующие OAuth1, будут иметь права администратора.
Посетите страницу настроек вашей установки Foreman, чтобы включить сопоставление и / или узнать / установить строки «ключ» и «секрет» OAuth1.
Хотя настоящие пользователи могут проходить аутентификацию через LDAP (например, в вашей корпоративной Active Directory) или другими способами, сценарий, использующий OAuth1, может использовать одни и те же значения «ключа» и «секрета» навсегда - они даже не имеют срока действия.
редактировать: включение сопоставления пользователей, похоже, совсем не улучшает безопасность - любой можно указать существующее имя учетной записи, при этом не требуется знание пароля учетной записи или каких-либо других секретов.
Таким образом, мой простой скрипт поиска Foreman, реализованный на Python (без поддержки разбивки на страницы - все мои запросы возвращают менее 50 записей):
from requests_oauthlib import OAuth1Session
import json
import sys
search=sys.argv[1]
fields=sys.argv[2:]
if not fields:
fields = ['ip']
URL=("https://foreman.example.net/api/v2/hosts?search=%s" % search)
# The below highly-secret credentials come from
#
# https://foreman.example.net/settings
#
Key='mykey'
Secret='mysecret'
User='readonly'
session=OAuth1Session(Key, Secret)
# The FOREMAN-USER header is necessary, if mapping of OAuth-requests is
# turned on in Foreman's settings. The username must exist and have the
# right "roles" enabled to allow the account to perform the request.
session.headers.update({'FOREMAN-USER': User})
request=session.get(URL, verify='/path/to/your/CA/certificate.crt')
if not request.ok:
request.raise_for_status()
response=json.loads(request.content)
results=response["results"]
for i in xrange(0, response["subtotal"]):
entry=results[i]
if i > 0:
print
for field in fields:
try:
print entry[field],
except KeyError:
print '-',