Назад | Перейти на главную страницу

Может ли Foreman разрешить анонимный доступ только для чтения?

Мне нужно автоматическое задание для выполнения вызовов 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 '-',