Ansible: Windows 10 / WSL: Ansible не может читать ansible.cfg из файлов NTFS

Созданный на 6 июл. 2018  ·  37Комментарии  ·  Источник: ansible/ansible

РЕЗЮМЕ

В Ansible 2.6.1 добавлен https://github.com/ansible/ansible/pull/42070, который заставляет Ansible игнорировать файлы ansible.cfg в 777 каталогах. Проблема в том, что все монтирования NTFS (все, что находится под /mnt/c ) в WSL в Windows 10 - это 777, поскольку их разрешения управляются Windows.

Обнаружить установку WSL довольно просто, я использовал ansible_kernel.find('Microsoft') != -1 для обнаружения WSL. Проверено на Arch, Ubuntu и Kali.

ТИП ВЫПУСКА
  • Сообщение об ошибке
КОМПОНЕНТ НАЗВАНИЕ

библиотека / ansible / config / manager.py

ДОСТУПНАЯ ВЕРСИЯ
ansible 2.6.1
  config file = None
  configured module search path = [u'/home/cbailey/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.15 (default, May  1 2018, 05:55:50) [GCC 7.3.0]
КОНФИГУРАЦИЯ

Нет данных

ОС / СРЕДА

Windows 10 + любой дистрибутив WSL

ДЕЙСТВИЯ ПО ВОСПРОИЗВЕДЕНИЮ
  1. Установите дистрибутив WSL
  2. sudo pip install ansible==2.6.1
  3. Поместите ansible.cfg где-нибудь на свой диск C:\
  4. cd в каталог из WSL
  5. Запустите любую команду Ansible
ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ

ansible.cfg файлы при монтировании Windows в WSL не игнорируются

ФАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ

ansible.cfg файл игнорируется со следующим предупреждением:

[WARNING] Ansible is in a world writable directory (/mnt/c/**), ignoring it as an ansible.cfg source.
affects_2.6 bug core windows

Самый полезный комментарий

Думаю, нашел решение для 2.6.1 и так далее ...

Создайте этот файл в своем wsl: /etc/wsl.conf

Содержание:

[automount]
enabled = true
mountFsTab = false
root = /mnt/
options = "metadata,umask=22,fmask=11"

[network]
generateHosts = true
generateResolvConf = true

После этого у всех / mnt / c / foo будут разные права доступа к папкам (больше не 777), и вы сможете использовать chmod.
Насколько мне известно, у вас должна быть последняя версия WSL.
wsl.conf документы

Все 37 Комментарий

Файлы, указанные в описании:

Если эти файлы неточны, обновите раздел описания component name или используйте команду !component bot.

нажмите здесь, чтобы получить помощь по ботам

Файлы, указанные в описании:

Если эти файлы неточны, обновите раздел описания component name или используйте команду !component bot.

нажмите здесь, чтобы получить помощь по ботам

Обнаружение того, что система является WSL, все равно оставит уязвимость. Нам нужно будет определить, что файл не доступен для записи всем или находится в каталоге, доступном для записи, несмотря на то, что в разрешениях указано, что это так.

Мы также не поддерживаем Ansible на хостах Windows, поэтому мы не можем гарантировать, что для этого будет создано исправление.

Я полностью понимаю необходимость обеспечения безопасности, но, по крайней мере, должна быть возможность отключить это. Может быть , то , что должно быть в /etc/ansible/ansible.cfg конкретно или что - то подобное , что делает его труднее перевернуть на.

Существуют и другие варианты использования, когда это может происходить не только при подключении Windows 10 NTFS к WSL. Если у вас есть подключение NTFS или подключение файлового ресурса Azure к заблокированному блоку сборки Linux, для подключения будет 777, но это не означает, что доверять файлам из этого расположения небезопасно.

OpenSSH не мешает вам включить root пароль для входа в систему, но он говорит вам, что это плохая идея. Большинство руководств по безопасности относятся к цели и окружающему контексту.

Может быть, вы могли бы разрешить людям вносить каталоги в белый список из этой проверки с помощью переменной среды? Что-то вроде ANSIBLE_TRUSTED_CONFIGPATHS или что-то в этом роде? Если конфигурация находится внутри пути в этой переменной, пропустить проверку разрешений?

Я не так хорошо разбираюсь в питоне, но, может быть, что-то вроде этого?

diff --git a/lib/ansible/config/manager.py b/lib/ansible/config/manager.py
index 48cf2cba3a..b356c84b9e 100644
--- a/lib/ansible/config/manager.py
+++ b/lib/ansible/config/manager.py
@@ -146,6 +146,10 @@ def find_ini_config_file(warnings=None):
    ''' Load INI Config File order(first found is used): ENV, CWD, HOME, /etc/ansible '''
    # FIXME: eventually deprecate ini configs

+    trusted_paths = os.getenv("ANSIBLE_TRUSTED_CONFIGPATHS",None)
+    if isinstance(trusted_paths, string_types):
+        trusted_paths=list(filter(None,trusted_paths.split(':')))
+
    path0 = os.getenv("ANSIBLE_CONFIG", None)
    if path0 is not None:
        path0 = unfrackpath(path0, follow=False)
@@ -154,7 +158,9 @@ def find_ini_config_file(warnings=None):
    try:
        path1 = os.getcwd()
        perms1 = os.stat(path1)
-        if perms1.st_mode & stat.S_IWOTH:
+        if trusted_paths and [i for i in trusted_paths if path1.startswith(i)]:
+            path1 += "/ansible.cfg"
+        elif perms1.st_mode & stat.S_IWOTH:
            if warnings is not None:
                warnings.add("Ansible is in a world writable directory (%s), ignoring it as an ansible.cfg source." % to_text(path1))
            path1 = None

Тогда я могу просто установить export ANSIBLE_TRUSTED_CONFIGPATHS=/mnt/c/Users/ в моем профиле оболочки?

Вы можете установить переменную ANSIBLE_CONFIG чтобы она указывала на ваш доступный для записи файл ansible.cfg, и в настоящее время он работает.

Да, это только текущий рабочий каталог, в котором мы проводим этот тест.
Это предотвращает сюрпризы, такие как изучение вашего дерева файлов, а затем запуск
ansible в / tmp и собирает вредоносный файл ansible.cfg

В чт, 5 июля 2018 г., 23:23 Рамин Барадари [email protected]
написал:

Вы можете установить переменную ANSIBLE_CONFIG так, чтобы она указывала на ваш мир с возможностью записи
ansible.cfg, и в настоящее время он работает.

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/42388#issuecomment-402938591 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAMxWr8Z2LerEPWWmwZu1BR5RT9qgdnTks5uDwJ5gaJpZM4VEmwB
.

Я использую бродягу в Windows для запуска доступных пьес.

Он по-прежнему не работает даже после установки значения ansible_config.

[ root @ controller ] # echo $ ANSIBLE_CONFIG
/ главная / бродяга / проекты / DevOps-проекты /

[ корень @ контроллер mapr-ansible-paysafe] # ls -lh ansible.cfg
-rwxrwxrwx. 1 бродяга бродяга 73 9 июля 07:43 ansible.cfg

[ root @ controller ] # ansible -m ping all -i environment / XXXX / cluster.ini -v
[ПРЕДУПРЕЖДЕНИЕ] Ansible находится в общем каталоге с возможностью записи (/ home / vagrant / projects / DevOps-Projects), игнорируя его как источник ansible.cfg .
Файл конфигурации не найден; используя значения по умолчанию

Временное решение
Install Only ansible 2.6.0

ANSIBLE_CONFIG env var должна указывать на файл, а не на каталог.

Я наткнулся на ту же проблему, и мне не нужен глобальный cfg для всех моих проектов, мне нужна конфигурация, относящаяся к проекту. Так как я могу это исправить?

Я наткнулся на ту же проблему, и мне не нужен глобальный cfg для всех моих проектов, мне нужна конфигурация, относящаяся к проекту. Так как я могу это исправить?

pip install ansible==2.6.0 пока разработчики не решат, как они хотят с этим справиться.

Проблемы и с общей папкой Vagrant, в данном случае это 0777 режим только для папок, и его нельзя изменить.
Пожалуйста, добавьте проверку, что папка CWD == папка, содержащая файл playbook, а затем не проверяйте, доступен ли мир для записи. Или, может быть, попытаться найти ansible.cfg в той же папке, что и файл playbook? Было бы полезно для бродячих пользователей Windows.

Думаю, нашел решение для 2.6.1 и так далее ...

Создайте этот файл в своем wsl: /etc/wsl.conf

Содержание:

[automount]
enabled = true
mountFsTab = false
root = /mnt/
options = "metadata,umask=22,fmask=11"

[network]
generateHosts = true
generateResolvConf = true

После этого у всех / mnt / c / foo будут разные права доступа к папкам (больше не 777), и вы сможете использовать chmod.
Насколько мне известно, у вас должна быть последняя версия WSL.
wsl.conf документы

Хорошо, комментарий в https://github.com/ansible/ansible/issues/42388#issuecomment -403926971 - это эквивалент совета, который мы бы сказали людям, монтирующим файловую систему ntfs или vfat под Unix, поэтому я думаю, что это правильное решение Вот.

Для людей , использующих ANSIBLE_CONFIG (правильно ... в качестве agaffney нот, он должен указывать на файл , а не каталог), пожалуйста , проверьте конфигурационный файл фактически игнорируются , или это просто выплюнуть дополнительное предупреждение.

Глядя на код, я думаю, что файл конфигурации читается, когда ANSIBLE_CONFIG используется правильно. Если это также является текущим рабочим каталогом, то предупреждающее сообщение выводится в дополнение к используемой конфигурации, поскольку она указана в ANSIBLE_CONFIG. Если это действительно проявляется симптом, его должно быть легко исправить, выдав предупреждение только в том случае, если единственная причина для использования конфигурации заключается в том, что она находится в текущем рабочем каталоге.

`` diff --git a / lib / ansible / config / manager.py b / lib / ansible / config / manager.py
индекс c308c3810d..36641d9e01 100644
--- a / lib / ansible / config / manager.py
+++ б / lib / ansible / config / manager.py
@@ -150,6 +150,8 @@ def find_ini_config_file (warnings = None):
'' 'Загрузка файла конфигурации INI в порядке (используется первый найденный): ENV, CWD, HOME, / etc / ansible' ''
# FIXME: со временем отказаться от конфигураций ini

  • warn_cwd_public = Ложь
    +
    path0 = os.getenv ("ANSIBLE_CONFIG", Нет)
    если path0 не равен None:
    path0 = unrackpath (path0, follow = False)
    @@ -159,8 +161,7 @@ def find_ini_config_file (warnings = None):
    путь1 = os.getcwd ()
    perms1 = os.stat (путь1)
    если perms1.st_mode и stat.S_IWOTH:
  • если предупреждений нет:
  • warnings.add ("Ansible находится в общем каталоге с возможностью записи (% s), игнорируя его как источник ansible.cfg."% to_text (path1))
  • warn_cwd_public = Верно
    path1 = Нет
    еще:
    путь1 + = "/ansible.cfg"
    @@ -175,6 +176,8 @@ def find_ini_config_file (warnings = None):
    еще:
    путь = Нет

  • если warn_cwd_public и warnings не None и path! = os.getcwd () + "/ansible.cfg":

  • warnings.add ("Ansible находится в общем каталоге с возможностью записи (% s), пропущен из списка возможных источников ansible.cfg."% to_text (path1))
    обратный путь
    что-то вроде этого должно быть точнее

Для меня лучшим решением является изменение разрешения на файловую систему nfs, смонтированную на wsl, с включенной опцией Metadata. Для этого выполните следующую процедуру: https://blogs.msdn.microsoft.com/commandline/2018/01/12/chmod-chown-wsl-improvements.

В основном сделайте следующее для монтирования ntfs, чтобы включить "chmod":

sudo umount /mnt/c
sudo mount -t drvfs C:/mnt/c -o metadata

А затем выполните chmod в папке, и все снова в порядке. После того, как метаданные были прикреплены к папке, они остаются там. По моему скромному мнению, должно быть по умолчанию wsl.

Решение для Vagrant, отредактируйте Vagrantfile и добавьте mount_options :

config.vm.synced_folder "../my-folder", "/home/vagrant/my-folder",  mount_options: ["dmode=775"]

Это хороший пример того, почему ansible - это высоконадежный модуль для создания вашего проекта.

Я подготовил проект vagrant + virtualbox + ansible 3 года назад. С тех пор каждые 5 месяцев анзибль перерывается. Я должен найти обходные пути, чтобы ПОРЯДОК РАБОТЫ ПОСТОЯННО. Поэтому я не могу сказать (немногим) пользователям системы, что «это работает», потому что время от времени она просто ломается. Это работало 3 недели назад и не работает сейчас. И это не изменение версии мэра, а просто незначительное изменение, поэтому критические изменения не вариант.

(см. "touch" не реализован в течение многих лет, модуль apt не имеет автоматического удаления, но имеет реализованные предупреждения о том, что я не должен вызывать "apt" как команду, stat.md5 удален без уведомления, расположение vault_password.txt не было разрешено устанавливать в недоступном. cfg (запрос функции закрыт, затем реализован спустя годы) и т. д.)

Вам нужно использовать обходные пути каждые несколько недель, чтобы получить тот же результат, что и раньше.

Я надеялся на более зрелое управление проектами от Redhat и ansible 2.0, но пусть это будет предупреждением для новичков, что ansible требует поддержки.

Не могли бы вы написать это предупреждение в STDERR вместо STDOUT ?

[WARNING] Ansible is in a world writable directory...

Я вижу это сообщение, когда расшифровываю файл переменных в STDOUT, и мне придется взломать какой-то специальный узел кода, чтобы следить за ним и вырезать эту строку.

О ха, похоже, это работает

export ANSIBLE_CONFIG=./ansible.cfg

Добавьте это в любые настройки vagrant / docker / wsl

Обо всех этих обходных путях полезно знать, но я думаю, что это нелепое предположение, и не иметь возможного обходного пути с встроенными флагами ansible-playbook. Сейчас я трачу свой день на обновление 40 заданий сборки с помощью хитрых обходных путей для критических изменений, которые были внесены при изменении версии патча! И все эти сборки выполняются в недолговечных контейнерах, к которым имеет доступ один автоматизированный пользователь, поэтому эта опасная всемирная дыра в безопасности, от которой вы меня защищаете, является совершенно неверным предположением.

Быстрое обновление: мы не игнорируем это - мы рассматриваем несколько разных идей, чтобы сохранить исправление безопасности, чтобы не читать конфигурацию из незащищенного cwd. Поверьте мне, то, что было выпущено в ответ на недавние CVE по этому поводу, было очень взвешенным подходом по сравнению с некоторыми из применяемых драконовских мер.

Тем не менее, я уверен, что мы можем придумать усовершенствование или обходной путь, чтобы поддержать эти случаи, когда «всемирная запись доступна, но не совсем».

@thegreatjerboa Не могли бы вы

@jefflill Я работаю над предложением исправить более общую проблему (почти все предупреждения и ошибки, а также подробная информация о типе отладки) отправляются на стандартный вывод вместо стандартного вывода. к сожалению, меня постоянно втягивают в другие проблемы ...

@nitzmahone, это тот же пьеса . У нас есть репозиторий git для каждой пьесы, который запускается при регистрации. Ansible.cfg и playbook - это верхний уровень репо, который также является CWD при его запуске.

каталог playbook не просматривается для ansible.cfg

export ANSIBLE_CONFIG=./ansible.cfg

НЕ работает для меня, все еще получаю

 [WARNING] Ansible is in a world writable directory (/mnt/c/Users/soar/projectdir), ignoring it as an ansible.cfg source.

с ansible 2.6.2

Как я уже просил ... Действительно ли он забирает файл конфигурации, несмотря на
печать этого предупреждения?

Логика выводила предупреждение, даже если оно было использовано из-за
ANSIBLE_CONFIG.

43583 исправляет предупреждение и должен быть объединен позже сегодня для разработки (резервные копии для отслеживания)

Такая же проблема возникла сегодня после обновления. Мы используем это в производстве, поэтому сейчас наши отчеты о клиентах не работают. Пожалуйста, исправьте это.

Теперь это было исправлено в разработке через https://github.com/ansible/ansible/pull/43583 Backports для 2.6 и 2.5 находятся в двух PR https://github.com/ansible/ansible/pull/43648 и https : //github.com/ansible/ansible/pull/43649, и backport также был объединен со стабильным 2.4, если будет еще один выпуск 2.4.x.

Что в исправлении?

  • Документация, объясняющая риск безопасности и указывающий на правильный способ его устранения (монтирование файловой системы так, чтобы пользователь и группа, которым требуется доступ к ansible.cfg, могли сделать это, а не монтировать мир каталогов с возможностью записи.
  • Указатели на сообщения в блогах, объясняющие, как это сделать как для vagrant, так и для WSL (Vagrant, похоже, не имеет ничего более официального, чем сообщения в блоге, для объяснения, а функция WSL имеет как официальную документацию, так и сообщение в блоге, в котором более подробно объясняется, как монтировать файловые системы).
  • Документация, в которой объясняется, что установка ANSIBLE_CONFIG для нужного вам конфигурационного файла может быть использована, если вам действительно нужно иметь его в общем доступном для записи каталоге, как того
  • Исправление для предупреждения об пропуске каталога, чтобы не казалось, что файл конфигурации пропускается, когда он одновременно находится в текущем рабочем каталоге с возможностью записи и указан в ANSIBLE_CONFIG.

Если вы все еще сталкиваетесь с этой проблемой при тестировании ветки разработки, откройте новую проблему, чтобы сообщить нам точные симптомы, чтобы мы могли воспроизвести ее.

Если это может быть полезно в качестве варианта использования, мы используем ansible на машине ubuntu рабочей станции vmware, используя общую папку, указывающую на физическое местоположение.

Изначально это место монтирования было создано по ошибке с разрешениями 777. Мы снизили его до 755.

Я установил для переменной среды ANSIBLE_CONFIG абсолютный путь к имени файла ansible.cfg ( /path/to/ansible.cfg ), и я все еще получаю сообщение: [WARNING] Ansible is in a world writable directory ...

$ ansible --version
 [WARNING] Ansible is in a world writable directory (/c/Users/my/path/to/ansible), ignoring it as an ansible.cfg source.
ansible 2.6.2
  config file = /path/to/ansible.cfg
  configured module search path = [u'/home/me/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.12 (default, Dec  4 2017, 14:50:18) [GCC 5.4.0 20160609]

Если вы можете проверить это на ветке devel или одном из PR с backports до 2.6 или 2.5, это будет здорово. В противном случае вы можете дождаться выхода 2.6.3 и попробовать ее там.

В документации, которая была частью патча, есть ссылки на информацию для
как бродяга, так и окна о том, как монтировать файловые системы без мира
записываемые каталоги:
https://docs.ansible.com/ansible/devel/reference_appendices/config.html#avoiding -security-sizes-with-ansible-cfg-in-the-current-directory

Эта информация вам не подходит?

В пятницу, 17 августа 2018 г., 3:23 Whidegroup [email protected] написал:

Как только у нас будет версия 2.6.3 - теперь должна быть идея сделать ее
работать под Windows машиной. Может ли кто-нибудь посоветовать настройку
Комбо vagrant / ansible для правильной работы с указанием пути к файлу .cfg?

-
Вы получаете это, потому что изменили состояние открытия / закрытия.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/ansible/ansible/issues/42388#issuecomment-413823645 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAMxWhtxSRE6GQW6ZYJflqydXhrQW-FDks5uRpmLgaJpZM4VEmwB
.

У меня Ubuntu установлен в Windows 10 вместе с WSL

Я добавил следующее в свой / etc / environment

ANSIBLE_CONFIG = "/ etc / ansible / ansible.cfg"

Я все еще получаю сообщение об ошибке

Как те, кто добавил переменную окружения ANSIBLE_CONFIG, заставили ее работать?

Можете ли вы открыть новый билет с подробной информацией о вашей настройке, выводе и способах воспроизведения? Последние выпуски 2.6 и 2.7 должны работать без предупреждения, если установлен ANSIBLE_CONFIG

экспорт ANSIBLE_CONFIG =. / ansible.cfg

Если это ansible.cfg в вашем текущем каталоге, не знаю, почему вы не разрешаете его, поскольку вы перемещаетесь туда. Но иметь ANSIBLE_CONFIG - это здорово! И думать о безопасности намного лучше, чем игнорировать ее. Спасибо!!!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги