Restic: MacOS Mojave: ошибка: Открыть: ... операция не разрешена

Созданный на 17 окт. 2018  ·  56Комментарии  ·  Источник: restic/restic

Функции конфиденциальности MacOS Mojave, похоже, ограничивают доступ к файлам без доступа к файлам (по крайней мере, то, что, кажется, происходит), я получаю ошибки разрешений, которых не было до обновления.

MacOS 10.14

Запуск с помощью sudo:

can not obtain extended attribute com.apple.rootless for /Library/Application Support/com.apple.TCC
error: Open: open /Library/Application Support/com.apple.TCC: operation not permitted
error: open /Library/Preferences/com.apple.TimeMachine.plist: operation not permitted

... многие другие файлы.

Вывод restic version

0.9.2 (самая последняя в доморощенном)

Как именно ты запускал рестик?

Тот же скрипт bash, который я использовал в течение нескольких месяцев до обновления до Mojave, запускаемый с привилегиями root.

RESTIC_PASSWORD_FILE="/path/to/file.txt" \
HOME="/path/to/homedir" \
/usr/local/bin/restic \
    --repo sftp:myserver.local:my/repo/path \
    --option='sftp.command=ssh -p REDACTEDPORT -i REDACTEDKEYFILE -o identitiesonly=yes -l restic myserver.local -s sftp' \
    --exclude-file="${DIR}/global-exclude.txt" \
    --exclude-if-present='.norestic' \
    backup \
    --cleanup-cache \
    / \
    &>> /path/to/file.log

Какой бэкенд/сервер/службу вы использовали для хранения репозитория?

sftp, как указано выше. Тот же репозиторий, что и предыдущий.

Ожидаемое поведение

Будем надеяться, что он читает и создает резервные копии всех файлов при запуске от имени пользователя root (понимая, что это может быть не проблема, но похоже, что это, безусловно, проблема для резервных копий).

Фактическое поведение

как указано выше

Шаги для воспроизведения поведения

sudo bash restic-backup.sh (скрипт выше)

У вас есть идеи, что могло быть причиной этого?

Моя догадка:

У вас есть идея, как решить проблему?

Нет. Что я пробовал до сих пор:

  • В MacOS нет libcap, поэтому нельзя использовать setcap .
  • Попытался добавить restic в «Полный доступ к диску» в новых Системных настройках -> Панель «Безопасность и конфиденциальность», но безуспешно.

Рестик помог тебе или сделал тебя счастливым?

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

backup documentation wanted darwin discussion

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

Недавно я начал использовать Restic и пытался заставить его работать как задание cron, вызываемое из корневого crontab sudo crontab -e , чтобы я мог чувствовать себя в большей безопасности, когда мой сценарий резервного копирования находится в файле, доступном только с привилегиями sudo. . Я получал те же ошибки, что и @n8henrie, но теперь у меня есть рабочее решение, и я хотел бы знать, работает ли это для других здесь.

Сначала немного предыстории моей установки:

У меня есть сценарий резервного копирования в /Users/myuser/bin с именем restic-backup.sh с разрешениями 700 (только root/sudo чтение/запись/выполнение). Я запускаю этот файл с моим корневым crontab sudo crontab -e . Я использую iTerm в качестве терминала по умолчанию. Я установил restic и zsh с Homebrew.

macOS версии 10.14.5

restic-backup.sh:

В моем файле сценария резервного копирования есть следующее.

#!/usr/local/bin/zsh
restic_path="/usr/local/bin"
logFile="/Users/myuser/Documents/Backups/configurations/Mac/backup_logs/$(date +%F_%H%M)_restic.log"
unset HISTFILE
export RESTIC_REPOSITORY="..."
export AWS_ACCESS_KEY_I'd="..."
export AWS_SECRET_ACCESS_KEY="..."
export RESTIC_PASSWORD="..."
$restic_path/restic --verbose backup /Users/myuser  &> $logFile

Затем в моем корневом файле crontab: sudo crontab -e у меня есть:

0 */2 * * * /Users/myuser/bin/restic-backup.sh

В полном доступе к диску:

cron ==> /usr/sbin/cron
iTerm.app ==> /Applications/iTerm.app

Как и @n8henrie , я думал, что программы, которые фактически обращаются к файлам, таким как restic , будут теми, которые требуют FDA, но вместо этого кажется, что программам, выполняющим первоначальный запрос sudo , нужен FDA: cron в автоматическом случае и iTerm.app в ручном случае.

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

Да, очевидно, вам нужно сделать полный доступ к диску: https://www.backblaze.com/blog/mojave-permissions/

Вы _уверены_, что добавили правильный бинарный файл restic? Вы переместили файл или изменили какие-либо его атрибуты (право собственности и т. д.) после добавления его в Полный доступ к диску в Системных настройках?

(У меня есть Mac, но у меня еще нет Mojave, извините.)

Я использую homebrew, поэтому сначала я добавил /usr/local/bin/restic в Full Disk Access, запустил задание, отметил те же ошибки, а затем удалил это и добавил путь к фактическому двоичному файлу (отметив, что это, к сожалению, должно быть переделывать каждый раз при обновлении рестика): /usr/local/Cellar/restic/0.9.2/bin/restic , к сожалению вижу одни и те же ошибки.

Без изменений, добавил двоичный файл в полный доступ к диску, переключился обратно на терминал и запустил sudo myscript.sh , который работал для большинства файлов, но выдавал ошибки разрешения для других.

Примечание: есть еще одна (возможно, связанная с Мохаве) проблема, которую я пытаюсь конкретизировать: моя аутентификация по ключу sftp перестала работать при запуске из launchctl (от имени root), но работает при запуске вручную от имени root, но я зарегистрировать новую проблему, если я смогу определить, что она не относится к моей настройке.

Интересный. Что произойдет, если вы запустите restic напрямую? И/или добавьте свой сценарий в FDA. Просто стреляю в темноте, честное слово. Если бы у меня был Мохаве, я бы попробовал.

Хорошая мысль.

Сам мой скрипт не является исполняемым (на самом деле без уважительной причины), как уже отмечалось, я запускаю его с помощью sudo bash myscript.sh (на самом деле /usr/local/bin/bash ); его нельзя добавить в FDA, поскольку он не является исполняемым.

Я попытался добавить /usr/local/bin/bash в FDA, но не в кости.

РЕДАКТИРОВАТЬ: очевидно, я ошибаюсь, даже после chmod +x мои backup.sh по-прежнему не могут быть добавлены непосредственно в FDA (в то время как двоичные файлы bash и restic может). Странный.

РЕДАКТИРОВАТЬ2: Чтобы быть тщательным, я добавил двоичные файлы bash и restic в FDA и вижу ту же ошибку.

Вероятно, это более серьезная проблема, чем restic - я даже пытался добавить /bin/ls в список FDA и все равно получаю сообщение об ошибке.

$ sudo /bin/ls /Users/me/Library/Suggestions
ls: Suggestions: Operation not permitted

РЕДАКТИРОВАТЬ: Уродливый обходной путь: добавьте Terminal.app к разрешениям FDA, и ошибки разрешений исчезнут.

Соответствующая тема: https://forums.developer.apple.com/thread/107546

Пробовал codesign использовать как двоичный файл restic, так и мой скрипт backup.sh и добавлять в FDA, но безуспешно.

(После прочтения части этой темы) Боже мой. Это очень раздражает. Спасибо, что заглянули! Я тоже продолжу расследование после обновления ...

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

@mholt Если вы хотите, вы можете установить 30-дневную пробную версию VMware Fusion и установить в нее Mojave (если только Apple не лишила возможности установить ее ad-hoc). Эта пробная версия не загрязняет окружающую среду и может быть удалена, если вы не захотите ее использовать позже.

Выше я отметил , что добавление Terminal.app в список System Preferences -> Security & Privacy -> Full Disk Access было обходным путем, поскольку, когда я вручную запускал свой скрипт ( sudo /usr/local/bin/bash mybackup.sh ), похоже, он работал без ошибок прав доступа.

По какой-то причине, когда я сегодня утром проверил свои журналы после автоматического ночного запуска restic (на основе сценария launchd в /Library/LaunchDaemons/com.n8henrie.restic.plist , который запускается каждую ночь с привилегиями root), ошибки разрешений все еще присутствуют.

И, к сожалению, теперь я не могу заставить обходной путь работать — даже с Terminal.app в FDA я все еще получаю ошибки разрешений при запуске sudo launchctl start com.n8henrie.restic или sudo /usr/local/bin/bash mybackup.sh .

Значит обходной путь не работает, или что-то изменилось.

EDIT: Gah, только что добавил все 3 в FDA -- Terminal.app , /usr/local/bin/bash и /usr/local/Cellar/restic/0.9.2/bin/restic -- и теперь он работает без ошибок. 🤷‍♂️

FWIW, вот мой вывод журнала , который содержит список файлов с ошибками. Как вы можете видеть, есть некоторые большие проблемы, такие как моя библиотека фотографий.

@ n8henrie Из ветки поддержки Mac, на которую вы ссылались ранее, кажется, что FDA требует, чтобы одобренные приложения были зарегистрированным пакетом .app в папке «Приложения», что может быть причиной успеха Terminal.app ... но вы должны добавить все 3 в FDA в вашем случае? Интересный...

@mholt похоже, что происходит что-то еще. Я оставил свои настройки точно такими же, какими они были вчера (все 3 в FDA, которые не привели к ошибкам разрешений), и мой ночной запуск все еще вызывал те же старые ошибки разрешений.

Это произошло уже дважды, когда после некоторого возни я получаю ошибки без разрешений, которые затем появляются снова. Restic каким-то образом знает, изменился ли файл, не открывая файл - какой-то кеш? Интересно, меня обманывают прогоны, которые выполняются близко друг к другу, и в файле не было промежуточных изменений, и поэтому restic не пытается его открыть?

Иначе мне трудно объяснить, что здесь происходит.

Хороший вопрос. Я знаю, что Restic использует кеш, но я не изучал, насколько агрессивно он придерживается его в случае ошибок разрешений и т. д.

Соответствующее обсуждение на SO: https://apple.stackexchange.com/q/338213/27415

Хороший вопрос. Я знаю, что Restic использует кеш, но я не изучал, насколько агрессивно он придерживается его в случае ошибок разрешений и т. д.

Нисколько. Кэш содержит только файлы из репозитория, информация о файловой системе (которой нет в репо) не включается.

Хорошо -- да, я не думаю, что это ошибка в Restic. Это определенно проблема macOS Mojave, которую на данный момент я почти уверен, что сам restic ничего не может исправить.

Круто, спасибо за отзыв, тему пока закрываю. Пожалуйста, добавьте больше комментариев, если вы узнаете что-то. Спасибо!

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

Я понимаю, что это не в первую очередь проблема с рестиком, но, похоже,
есть некоторые разумные шаги, которые можно предпринять для пользователей MacOS. Как есть,
возможность пользователя создавать резервные копии наиболее важных личных
данные (например, фотографии) скомпрометированы по умолчанию в текущей версии
MacOS. Мне кажется, это очень важно для любого программного обеспечения для резервного копирования!

Некоторые предложения/возможности (над которыми я буду рад помочь в работе):

  • Варианты устранения проблемы

    • Можно ли предоставить правильное приложение-оболочку MacOS, которое

      может быть добавлен в список FDA, который содержит двоичный файл restic

    • Если в состоянии выяснить, как сделать выше, вместо предоставления

      приложение, можем ли мы включить инструкции о том, как пользователи могут это сделать

      сами с помощью какого-то Makefile или XCode?

  • Обходные пути

    • Предоставьте в документации информацию о наиболее безопасных/минимальных двоичных файлах.

      которые необходимо добавить в FDA

    • Предоставьте ссылки на информацию об (и рисках) отключения SIP.

  • Предупреждения

    • Включите в документы информацию, которой не будет у пользователей Мохаве.

      их данные полностью резервируются по умолчанию

В целом, ситуация не сильно отличается от полной резервной копии без рута .
в Linux, при этом полное отключение SIP похоже на запуск от имени
root, а также определить и рекомендовать достаточно безопасный компромисс с
FDA - это что-то вроде использования setcap .

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

Еще несколько обновлений теперь, когда я вернул свою машину:

Я не могу повторить мои успехи, описанные выше, в получении полной резервной копии системы из моего сценария запуска.

Я попытался добавить все нижеперечисленное в список FDA (одновременно) и все равно получаю ошибки:

  • рестик
  • бить
  • запускctl
  • запуск
  • Терминал.приложение

Просто для эксперимента: голые двоичные файлы, похоже, нормально работают при добавлении в список FDA и, похоже, не имеют ничего общего с кодированием. Сравните двоичные файлы ls , предоставленные MacOS и Homebrew:

$ codesign -d /bin/ls
Executable=/bin/ls
$ codesign -d /usr/local/opt/coreutils/libexec/gnubin/ls
/usr/local/opt/coreutils/libexec/gnubin/ls: code object is not signed at all

До и добавление в список FDA:

$ /bin/ls ~/Library/Mail
ls: Mail: Operation not permitted
$ /usr/local/opt/coreutils/libexec/gnubin/ls ~/Library/Mail
ls: cannot open directory '/Users/n8henrie/Library/Mail': Operation not permitted
$ # Added to FDA
$ /bin/ls ~/Library/Mail
PersistenceInfo.plist V6
$ /usr/local/opt/coreutils/libexec/gnubin/ls ~/Library/Mail
PersistenceInfo.plist  V6

Кроме того, они отлично работают при добавлении в сценарий bash, если ls находятся в FDA (нет необходимости добавлять bash отдельно), что заставляет меня думать, что мне нужно добавить только restic .

Кроме того, для сравнения, запуск следующих ошибок сценария Go если не в FDA, но отлично работает сам по себе, а также при вызове из launchd, пока бинарный файл находится в FDA (не нужно добавлять launchd / launchctl / что-либо еще).

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    matches, err := ioutil.ReadDir("/Users/n8henrie/Library/Mail")
    if err != nil {
        fmt.Println("Err:", err)
    } else {
        for _, match := range matches {
            fmt.Println(match.Name())
        }
    }
}

Вывод:

$ ./gotest
Err: open /Users/n8henrie/Library/Mail: operation not permitted
$ # Add to FDA
$ ./gotest
.DS_Store
PersistenceInfo.plist
V6

Далее я поэкспериментирую с Restic, чтобы понять, почему он получает ошибки прав доступа даже при добавлении в FDA (хотя другие двоичные файлы, похоже, работают после добавления).

Хорошо, спасибо за отзыв! Я снова открою этот вопрос, может быть, мы сможем понять, что происходит, а затем добавить некоторую документацию в руководство.

~ Все еще получаю ошибки Open в новом репо, а restic добавлено в список FDA.~

См. редактирование ниже.

$ restic -r /tmp/restic backup ~/Library/Mail -vvv
open repository
enter password for repository:
repository 9ccb5357 opened successfully, password is correct
created new cache in /Users/me/Library/Caches/restic
lock repository
load index files
start scan on [/Users/me/Library/Mail]
start backup on [/Users/me/Library/Mail]
scan: Open: open /Users/me/Library/Mail: operation not permitted
scan finished in 1.849s: 0 files, 0 B
can not obtain extended attribute com.apple.quarantine for /Users/me/Library/Mail:
error: Open: open /Users/me/Library/Mail: operation not permitted
new       /Users/me/Library/, saved in 0.012s (0 B added, 13 B metadata)
new       /Users/me/, saved in 0.012s (0 B added, 381 B metadata)
new       /Users/, saved in 0.013s (0 B added, 379 B metadata)

Files:           0 new,     0 changed,     0 unmodified
Dirs:            3 new,     0 changed,     0 unmodified
Data Blobs:      0 new
Tree Blobs:      4 new
Added to the repo: 1.119 KiB

processed 0 files, 0 B in 0:01
snapshot 4a658c73 saved
$ restic -r /tmp/restic ls latest
enter password for repository:
repository 9ccb5357 opened successfully, password is correct
snapshot 4a658c73 of [/Users/me/Library/Mail] filtered by [] at 2018-11-04 11:30:05.334024 -0700 MST):
/Users
/Users/me
/Users/me/Library

screenshot 2018-11-04 at 11 32 18 am

РЕДАКТИРОВАТЬ: не обращайте внимания на этот комментарий - меня все еще мучают периодические ошибки, которые мешают любому прогрессу, возможно, в связи со вчерашним обновлением до MacOS 10.14.1. Сегодня тот же самый вчерашний код Go , который постоянно работал с FDA и терпел неудачу без него (я включал и выключал его несколько раз, чтобы быть уверенным) , больше не работает даже с FDA . То же самое с ls .

Это работает, если Terminal.app добавлено в FDA (в качестве единственной записи), в чем вчера не было необходимости.

🤷‍♂️

Я сообщу, если найду что-нибудь по этому поводу на форумах Apple.

РЕДАКТИРОВАТЬ 2: Macbook жены все еще находится на 10.14, и /bin/ls ~/Library/Mail не работает с /bin/ls , добавленным в FDA, поэтому кажется, что это не может быть чем-то новым в 10.14.1. 😕

Все еще работаю над этим.

Это по-прежнему довольно болезненно, но у меня наконец-то есть обходной путь, который, я думаю, подойдет для моих целей.

Я подробно описал процесс здесь , но суть такова:

Вы можете использовать Script Editor.app , чтобы превратить AppleScript в пакет приложения. Этот AppleScript может запустить ваш сценарий резервного копирования restic (в моем случае /path/to/restic-backup.sh , где restic-backup.sh — это скрипт bash, который запускает restic с нужными мне настройками), и вы можете добавить полученный пакет приложений в FDA в чтобы получить доступ к защищенным файлам.

Однако это затрудняет автоматизацию резервного копирования на системном уровне. Встроенная команда open работает, но запускает приложение под вашим пользователем, поэтому, хотя указанные выше файлы, защищенные FDA, находятся в резервной копии, вы получите ошибки прав доступа к любым файлам, которые доступны только для чтения root (например, root принадлежащие 0600 вещи).

Мой обходной путь на этом этапе состоит в том, чтобы AppleScript вызывал сценарий резервного копирования с помощью sudo и давал моим пользователям привилегии для запуска этого сценария с привилегиями root без пароля ( sudo visudo , NOPASSWD: , и т.д.).

Это некрасиво, но, похоже, работает.

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

Невероятно, похоже, это работает и намного чище и проще.

// Runrestic provides a binary to run my restic backup script in MacOS Mojave with Full Disk Access
package main

import (
    "log"
    "os"
    "os/exec"
    "path/filepath"
)

func main() {
    ex, err := os.Executable()
    if err != nil {
        log.Fatal(err)
    }
    dir := filepath.Dir(ex)
    script := filepath.Join(dir, "restic-backup.sh")
    cmd := exec.Command("/usr/local/bin/bash", script)
    if err := cmd.Run(); err != nil {
        log.Fatal(err)
    }
}

Полученный двоичный файл может быть chown root и chmod 0700 , а затем добавить к полному доступу к диску, и, похоже, он работает. Затем его можно добавить в plist /Library/LaunchDaemons для автоматического запуска.

Первые 2 прогона пока работают, я надеюсь, что это не закончится, как несколько фальстартов выше.

Мой автоматический запуск прошлой ночью сработал. Сегодня я внедряю эту стратегию на Macbook Air моей жены, и если она будет работать и там, я сочту это разумным решением и поработаю над небольшим PR на https://github.com/restic/restic. net (если это кажется разумным).

Привет @ n8henrie , я пришел сюда после того, как столкнулся с этой проблемой, а затем нашел ваш пост в блоге. Спасибо за все это исследование.

Приведенное выше решение (вызов сценария оболочки из простого бинарного файла Go) у меня не работает. Вы уверены, что он успешно обращается ко всем вашим файлам?

В частности, я заметил, что stdout/stderr сбрасывается в /dev/null. Он также не может читать стандартный ввод, если, например, restic хочет запросить пароль. (Также забавно, почему ваш bash /usr/local/bin/bash , а не /bin/bash ? Просто любопытно.)

В любом случае я внес следующие изменения, чтобы увидеть вывод ошибки:

    cmd := exec.Command("/bin/bash", script)
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

До того, как я увидел ваше сообщение в блоге, моим первым побуждением было добавить сам двоичный файл restic в FDA, и это не сработало для меня в версии 10.14.1 (18B75). Я не уверен, почему вставка другой программы (оболочка Go, вызывающая сценарий оболочки, в конечном итоге вызывающая restic) что-то изменит.

Это все еще работает для вас?

@n8henrie, спасибо, что держите нас в курсе! Вы также можете написать об этом сообщение в блоге restic, если хотите (в дополнение к небольшому разделу в руководстве или около того)... :)

@fd0 Для меня будет честью!

@armhold да, кажется, работает как шарм, см. ниже. На MBA моей жены, я думаю, мне потребовалась перезагрузка, прежде чем он начал работать (но не на моем). IIRC для нее, я создал двоичный файл, затем перезагрузился, затем добавил в FDA, и это сработало.

До исправления:

Thu Nov 15 02:00:00 MST 2018 :: Starting restic-backup.sh
can not obtain extended attribute com.apple.rootless for /Library/Application Support/com.apple.TCC:
error: Open: open /Library/Application Support/com.apple.TCC: operation not permitted
error: open /Library/Preferences/com.apple.TimeMachine.plist: operation not permitted
error: Open: open /Users/me/Library/Application Support/AddressBook: operation not permitted
error: Open: open /Users/me/Library/Application Support/CallHistoryDB: operation not permitted
error: Open: open /Users/me/Library/Application Support/CallHistoryTransactions: operation not permitted
error: Open: open /Users/me/Library/Application Support/MobileSync: operation not permitted
error: Open: open /Users/me/Library/Application Support/com.apple.TCC: operation not permitted
error: Open: open /Users/me/Library/Calendars: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.Home: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.Safari: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.VoiceMemos: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.iChat: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.mail: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.news: operation not permitted
error: Open: open /Users/me/Library/Containers/com.apple.stocks: operation not permitted
can not obtain extended attribute com.apple.quarantine for /Users/me/Library/Cookies:
error: Open: open /Users/me/Library/Cookies: operation not permitted
error: Open: open /Users/me/Library/HomeKit: operation not permitted
error: Open: open /Users/me/Library/IdentityServices: operation not permitted
can not obtain extended attribute com.apple.quarantine for /Users/me/Library/Mail:
error: Open: open /Users/me/Library/Mail: operation not permitted
error: Open: open /Users/me/Library/Messages: operation not permitted
error: Open: open /Users/me/Library/Metadata/CoreSpotlight: operation not permitted
error: Open: open /Users/me/Library/Metadata/com.apple.IntelligentSuggestions: operation not permitted
can not obtain extended attribute com.apple.metadata:com_apple_backup_excludeItem for /Users/me/Library/PersonalizationPortrait:
error: Open: open /Users/me/Library/PersonalizationPortrait: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.KaSTvBv: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.M410OmB: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.Sjhd5Xh: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.AddressBook.plist.ceAM0im: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.homed.notbackedup.plist: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.homed.plist: operation not permitted
error: open /Users/me/Library/Preferences/com.apple.mail-shared.plist: operation not permitted
error: Open: open /Users/me/Library/Safari: operation not permitted
can not obtain extended attribute com.apple.metadata:com_apple_backup_excludeItem for /Users/me/Library/Suggestions:
error: Open: open /Users/me/Library/Suggestions: operation not permitted
can not obtain extended attribute com.apple.FinderInfo for /Users/me/Pictures/Photos Library.photoslibrary:
can not obtain extended attribute com.apple.quarantine for /Users/me/Pictures/Photos Library.photoslibrary:
error: Open: open /Users/me/Pictures/Photos Library.photoslibrary: operation not permitted

Files:         179 new,   261 changed, 857338 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Added to the repo: 266.392 MiB

processed 857778 files, 186.192 GiB in 12:57
snapshot 46831f24 saved
Thu Nov 15 02:12:58 MST 2018 :: restic-backup.sh finished.
Duration: 778 seconds

После исправления:

Tue Nov 27 02:00:00 MST 2018 :: Starting restic-backup.sh

Files:         389 new,  2367 changed, 1055845 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Added to the repo: 430.279 MiB

processed 1058601 files, 295.471 GiB in 18:16
snapshot e58d8f1c saved
Tue Nov 27 02:18:17 MST 2018 :: restic-backup.sh finished.
Duration: 1097 seconds

То же исправление также работает на Macbook Air моей жены, оба проверены на удаленном компьютере с помощью restic find '/Users/*/Library/Mail' --snapshot latest --host=$(hostname) (где ~/Library/Mail — это один из обычно защищенных каталогов, как видно из журнала ошибок выше) .

В частности, я заметил, что stdout/stderr сбрасывается в /dev/null. Он также не может читать стандартный ввод, если, например, restic хочет запросить пароль.

Это будет полностью зависеть от вашего сценария. Как вы можете видеть в моем исходном сообщении, поскольку моя установка полностью автоматизирована, она настроена на чтение пароля из файла (принадлежащего root 0600), но также может читать из envvar или любым из обычных методов. Вы правы, я не думаю, что это сработает для интерактивных вещей. Он также записывает все в файл: &>> /path/to/file.log .

(Также забавно, почему ваш bash /usr/local/bin/bash, а не /bin/bash? Просто любопытно.)

Я использую Homebrew , чтобы получить более новую версию bash

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
$ /usr/local/bin/bash --version
GNU bash, version 4.4.23(1)-release (x86_64-apple-darwin17.5.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Это дает мне более современные функции, такие как оператор &>file.log (который экономит несколько нажатий клавиш по сравнению с 2>&1 >file.log .

До того, как я увидел ваше сообщение в блоге, моим первым побуждением было добавить сам двоичный файл restic в FDA, и это не сработало для меня в версии 10.14.1 (18B75). Я не уверен, почему вставка другой программы (оболочка Go, вызывающая сценарий оболочки, в конечном итоге вызывающая restic) что-то изменит.

Я тоже не совсем уверен в этом. Для моего варианта использования у меня есть много других настроек, которые я делаю в своем сценарии bash (несколько сложная команда sftp, где место назначения, пути резервного копирования и несколько параметров основаны на имени хоста), поэтому вызов самого бинарного файла restic не был опция. Могу немного поэкспериментировать.

Хорошо, спасибо за объяснение. Я только что попытался восстановить, перезагрузить + добавить FDA, и я все еще получаю operation not permitted . Также попытался переместить бинарную оболочку и сценарий оболочки в /Applications, но безуспешно. Я буду копать.

Хм. Определенно не нужно быть в /Applications для меня.

Вы на 10.14 или 10.14.1? Я на последнем.

И вы можете попробовать использовать команду tccutil, на которую я ссылался, чтобы заранее очистить все записи.

У меня 10.14.1 (18B75). Я тоже попробовал команду tccutil, но безуспешно. Я понимаю, почему Apple делает это, но меня действительно расстраивает отсутствие четкого понимания того, что здесь делать.

Хм. Это странно.

Как ни странно, я пытался, и я не могу заставить двоичный файл restic работать напрямую.

Непонятно, почему это не работает, но мой обходной путь (для меня).

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

@armhold , можете ли вы опубликовать копию точного сценария bash и кода Go, который вы
с помощью и как вы его запускаете? Я посмотрю, смогу ли я воспроизвести на своем конце.

Как ни странно, я пытался, и я не могу заставить двоичный файл restic работать напрямую.

Да, вот чего я не понимаю. Я не понимаю, почему обертка Go преуспеет там, где сам двоичный файл restic потерпит неудачу. Кажется, что-то не так.

Можете ли вы опубликовать копию точного сценария bash и кода Go, который вы используете, и как вы его запускаете?

Конечно, вот он: https://github.com/armhold/restic-fda.

  • и сценарий оболочки, и оболочка go установлены в моем каталоге ~/bin .
  • добавлено ~/bin/restic-fda в FDA через Системные настройки
  • Я запускаю restic-fda из учетной записи пользователя без полномочий root в интерактивном режиме в командной строке терминала. Я получаю такие ошибки, как: error: Open: open /Users/armhold/Library/Application Support/AddressBook: operation not permitted .
  • запуск от имени root (через sudo) не работает аналогично

Я не пробовал запускать его через launchctl.

Little Snitch, брандмауэр, делает что-то подобное - для исходящих соединений он спрашивает, разрешить ли «Терминалу через restic» выполнять соединение (а не просто restic); т.е. Terminal.app является основным для предоставления разрешения.

В конце концов я объединил свой сценарий оболочки в приложение с помощью Platypus и предоставил FDA этому сгенерированному приложению. Затем запустите резервное копирование через Finder. Работает до сих пор.

launchctl будет следующим шагом.

К вашему сведению, это все еще работает для меня (в том числе после последней версии MacOS
Обновить). Есть новости от @armhold?

Все еще не работает для меня. Я сдался и просто дал Терминал FDA.

К сожалению, я снова в тупике.

Я на 10.14.2. Мой сценарий резервного копирования restic все еще работает, в его журналах нет ошибок прав доступа. Однако теперь я не могу заставить работать скрипт @armhold или даже мои предыдущие тестовые скрипты (которые ничего не делают, кроме открытия защищенного каталога ~/Library/Mail ).

🤷‍♂️

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

@mholt Каков статус этого и релики - вы как-то обошли это, и если да, можете ли вы поделиться с нами, какие шаги вы предпринимаете для этого?

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

@rawtaz

Каков статус этого и релика - вы как-то обошли это, и если да, то не могли бы вы поделиться с нами, какие шаги вы предпринимаете для этого?

Я сам обновился до Мохаве только на прошлой неделе. Но я установил Relica и смог воспроизвести ошибку «операция не разрешена» при попытке сделать резервную копию ~/Library/Mail.

Затем я добавил Relica.app на экран FDA и повторно запустил резервную копию Relica.

screen shot 2018-12-27 at 1 54 49 pm

На этот раз резервное копирование было успешно выполнено без ошибок (тогда как первый снимок, сделанный Relica+restic, вообще не показывал папку Mail из-за ошибки разрешения):

screen shot 2018-12-27 at 1 51 31 pm

Поэтому я боюсь, что у меня нет ответов, чтобы внести свой вклад в эту тему. :-/ Я не уверен, что он будет продолжать работать, но, конечно, надеюсь.

Я тоже решил обернуть свой сценарий резервного копирования restic в пакет .app, чтобы иметь возможность дать ему FDA. Это отстойно делать это, но, кажется, это единственный практический путь вперед.

Сначала я пытался дать просто бинарный файл FDA, но это не помогло.
Я также пытался предоставить свой сценарий резервного копирования (сценарий Bash, который вызывает restic) FDA, но это тоже не сработало.
Я не пробовал обертку @armhold .

Я использовал Platypus, как было предложено выше, и он отлично работает. Он создает пакет .app, который я затем могу передать FDA в системных настройках macOS, и это решает проблему.

Единственный недостаток, который я заметил во время использования, заключается в том, что при запуске .app (для меня он запускается crontab с использованием open -ga ~/Applications/Backup.app , текущее окно теряет фокус. Это может серьезно раздражать моих пользователей, но это что это такое. По крайней мере, у нас снова есть рабочие резервные копии. Я думал, что переключатель -g позаботится об этом, но, к сожалению, это ничего не меняет.

Я очень кратко попытался увидеть, что произойдет, когда вы удалите пакет .app (переместите его в корзину, очистите корзину) и замените его новым пакетом .app с тем же именем. Мои наблюдения таковы, что когда вы удаляете старый, запись в FDA в системных настройках исчезает, но когда вы кладете новый на то же место, запись появляется снова, указывая, что система распознает и рассмотрит новый .app иметь FDA. Однако, когда я после этого запустил новое приложение, я получил исходные ошибки. Как только я удалил запись FDA для приложения в системных настройках и добавил для него новую запись FDA, ошибки снова исчезли. Итак, на данный момент я предполагаю, что при замене пакета .app мне также нужно заменить запись FDA, чтобы она работала. Вполне может быть, что если просто заменить части пакета .app, он продолжит работать. Это требует дальнейшего изучения AFAICT.

Для тех, кто хочет связать restic в пакет .app, вот довольно общий учебник, который я написал несколько месяцев назад о том, как сделать это для любой программы Go, включая код, если вы просто хотите изменить несколько настроек и быть в курсе. способ: https://medium.com/@mattholt/packaging -a-go-application-for-macos-f7084b00f6b5

10.14.3 - по-прежнему нет хороших новостей для работы только с бинарными файлами.

$ /bin/ls ~/Library/Mail/
ls: : Operation not permitted

Работает, если Terminal.app добавлен в FDA, но не только с ls (или другими двоичными файлами).

applescript/automator работает, но показывает значок в доке; в качестве альтернативы, используя xcode/swift cli, скомпилируйте это в двоичный файл и добавьте его в FDA (замените /full/path/to вашими реальными путями)

import Foundation
import os

let task = Process()

task.launchPath = "/full/path/to/bash"
task.arguments = ["/full/path/to/backup_script.sh"]

do{
    try task.run()
}
catch{
    os_log("error")
}

task.waitUntilExit()

@daviehh здесь не повезло.

import Foundation
import os

let task = Process()

task.launchPath = "/bin/ls"
task.arguments = ["/Users/me/Library/Mail"]

do{
    try task.run()
}
catch{
    os_log("error")
}

task.waitUntilExit()
$ swiftc foo.swift
$ ./foo
ls: Mail: Operation not permitted
$ # add to FDA
$ ./foo
ls: Mail: Operation not permitted
$ sudo ./foo
ls: Mail: Operation not permitted

Недавно я начал использовать Restic и пытался заставить его работать как задание cron, вызываемое из корневого crontab sudo crontab -e , чтобы я мог чувствовать себя в большей безопасности, когда мой сценарий резервного копирования находится в файле, доступном только с привилегиями sudo. . Я получал те же ошибки, что и @n8henrie, но теперь у меня есть рабочее решение, и я хотел бы знать, работает ли это для других здесь.

Сначала немного предыстории моей установки:

У меня есть сценарий резервного копирования в /Users/myuser/bin с именем restic-backup.sh с разрешениями 700 (только root/sudo чтение/запись/выполнение). Я запускаю этот файл с моим корневым crontab sudo crontab -e . Я использую iTerm в качестве терминала по умолчанию. Я установил restic и zsh с Homebrew.

macOS версии 10.14.5

restic-backup.sh:

В моем файле сценария резервного копирования есть следующее.

#!/usr/local/bin/zsh
restic_path="/usr/local/bin"
logFile="/Users/myuser/Documents/Backups/configurations/Mac/backup_logs/$(date +%F_%H%M)_restic.log"
unset HISTFILE
export RESTIC_REPOSITORY="..."
export AWS_ACCESS_KEY_I'd="..."
export AWS_SECRET_ACCESS_KEY="..."
export RESTIC_PASSWORD="..."
$restic_path/restic --verbose backup /Users/myuser  &> $logFile

Затем в моем корневом файле crontab: sudo crontab -e у меня есть:

0 */2 * * * /Users/myuser/bin/restic-backup.sh

В полном доступе к диску:

cron ==> /usr/sbin/cron
iTerm.app ==> /Applications/iTerm.app

Как и @n8henrie , я думал, что программы, которые фактически обращаются к файлам, таким как restic , будут теми, которые требуют FDA, но вместо этого кажется, что программам, выполняющим первоначальный запрос sudo , нужен FDA: cron в автоматическом случае и iTerm.app в ручном случае.

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

@atticusmatticus @russelldavis -- Я думаю, что одно из недавних обновлений MacOS, возможно, снова что-то изменило -- я определенно пробовал обе эти стратегии, но безуспешно. Но я также попробовал следующее, которое перестало работать, но теперь снова работает (вроде):

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    fmt.Println("Starting...")
    matches, err := ioutil.ReadDir("/Users/me/Library/Mail")
    if err != nil {
        fmt.Println("Err:", err)
    } else {
        for _, match := range matches {
            fmt.Println(match.Name())
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.me.gotest</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/me/go/src/github.com/me/gotest/gotest</string>
        </array>
        <key>StartInterval</key>
        <integer>15</integer>
        <key>StandardErrorPath</key>
        <string>/Users/me/go/src/github.com/me/gotest/stderr.txt</string>
        <key>StandardOutPath</key>
        <string>/Users/me/go/src/github.com/me/gotest/stdout.txt</string>
    </dict>
</plist>
  1. go build
  2. Добавьте двоичный файл gotest (и ничего больше) в полный доступ к диску.
  3. скопируйте plist в ~/Library/LaunchAgents/
  4. Загрузите демон launchd: launchctl load -w ~/Library/LaunchAgents/com.me.gotest.plist

Теперь, что любопытно, с двоичным файлом gotest , но не launchd (или launchctl ), добавленным в FDA, я все еще не могу запустить напрямую:

$ ls -l gotest
-rwxr-xr-x 1 me staff 2142552 Jul  2 09:15 gotest
$ ./gotest
Starting...
Err: open /Users/me/Library/Mail: operation not permitted
$ sudo ./gotest
Password:
Starting...
Err: open /Users/me/Library/Mail: operation not permitted

Но он работает без ошибок из демона launchd (каждые 15 секунд, как настроено), который не работает от имени пользователя root ( ~/Library/ не /Library/ и launchctl load не sudo launchctl load ):

$ cat stdout.txt | head
Starting...
.DS_Store
PersistenceInfo.plist
V6
Starting...
.DS_Store
PersistenceInfo.plist
V6
Starting...
.DS_Store

Любопытно, что я до сих пор вижу, включая перезагрузку:

||перейти в двоичный файл в FDA|перейти в двоичный файл не в FDA
---|:---:|:---:
перейти на двоичный код без sudo |err|err
перейти на двоичный код с sudo |err|err
launchd работает go binary|RUNS|ошибка

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

FDA работает для приложений, внесенных в белый список (открытие означает, что они запускаются с помощью launchd), для любых дочерних процессов этих приложений, даже не внесенных в белый список, и для двоичных файлов из белого списка, если они запускаются напрямую launchd ( launchd.plist или launchctl submit ). Это не работает, если двоичный файл из белого списка запускается в дереве процессов с родительским приложением/двоичным файлом, не включенным в белый список.

Из этого видно, что launchd отвечает за внесение дерева процессов в белый список в зависимости от приложения/двоичного файла, внесенного в белый список.

Из экспериментов видно, что путь к двоичному файлу должен быть точным, поэтому белый список не будет запущен, если для двоичного файла из белого списка launchctl plist указан WorkingDirectory и используется относительный путь ./some-binary , он даже не будет работать для /some/path/./some-binary или /some/path/../path/some-binary только /some/path/some-binary .
Также невозможно использовать приложение из белого списка для shebang, даже если скрипт запускается напрямую с помощью launchd , поэтому #!/some/path/some-binary не будет работать, только /some/path/some-binary /path/to/script .

Я думаю, что у нас достаточно информации и точек данных, чтобы предоставить хотя бы некоторые рекомендации (и, возможно, ссылку на эту проблему) в документации, и я хотел бы начать над этим работать, если вы не возражаете.

Должен ли это быть новый пункт в разделе « Примеры », например раздел о резервном копировании без запуска от имени пользователя root в Linux ?

Планирую отметить, что:

  • Полный доступ к диску необходим для резервного копирования как можно большей части диска.
  • Сценарий launchd, работающий от имени пользователя root, может вызывать двоичный файл, занесенный в белый список FDA, без необходимости добавления launchd в FDA.
  • Если Terminal.app не указан в FDA, двоичный файл не может получить доступ ко всему диску при вызове из терминала.
  • Если Terminal.app указан в FDA, он может получить доступ ко всему диску при вызове двоичного файла независимо от того, находится ли этот двоичный файл в FDA.

Звучит ли это так, как будто это отражает понимание и опыт каждого?

Несмотря на некоторую запутанность, я был доволен своей установкой, работающей на 2 Macbook за последний > 1 год, и я, вероятно, включил бы ее части в качестве примера. Моя установка:

  • У меня есть сценарий оболочки, который запускает команду restic для конкретной машины на основе различных переменных среды (тот же сценарий также работает на 4 компьютерах Linux, которые напрямую вызывают этот сценарий).
  • На моих компьютерах с MacOS я создаю двоичный файл go, который просто запускает описанный выше сценарий оболочки. Здесь я использую сценарий оболочки для простой настройки/обновления/контроля версий, хотя это также можно легко сделать непосредственно в Go.
  • Этот двоичный файл добавлен в FDA
  • Я запускаю общесистемный демон launchd (который работает с правами суперпользователя), чтобы запустить этот двоичный файл go по расписанию.

У меня работает двоичный файл, похожий на https://github.com/restic/restic/issues/2051#issuecomment -442872479. Я пошел с c, так как сейчас у меня не установлен go. Для других, чтобы скопировать/вставить:

  1. резервная копия.с
#include <stdlib.h>
int main(void) {
  int status = system("./backup.sh");
  int ret = WEXITSTATUS(status);
  return ret;
}
  1. скомпилировать: gcc -Wall -o backup backup.c
  2. внесите в белый список двоичный файл резервной копии и используйте его по своему усмотрению.

Любопытно, что я до сих пор вижу, включая перезагрузку:

перейти на двоичный код в FDA перейти на двоичный файл не в FDA
перейти в двоичный код без sudo err err
перейти на двоичный код с sudo err err
launchd работает go binary RUNS err

Спасибо!

Решение для меня состояло в том, чтобы создать файл .plist, который напрямую вызывает restic, и поместить все параметры либо внутри, либо в отдельные файлы, используя параметры -p, --exclude-files, --files-from. И, конечно же, дайте разрешения Restic для бинарных файлов FDA:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>my.backup_agent</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/restic</string>
        <string>backup</string>

        <string>-r</string>
        <string>s3:https://MY.STORAGE.SERVER/....</string>

        <string>-p</string>
        <string>.config/backup/restic.pwd</string>

        <string>--files-from</string>
        <string>.config/backup/backup.lst</string>

        <string>--exclude-file</string>
        <string>.config/backup/exclude.lst</string>
    </array>

    <key>EnvironmentVariables</key>
    <dict>
        <key>AWS_ACCESS_KEY_ID</key>
        <string>XXX</string>

        <key>AWS_SECRET_ACCESS_KEY</key>
        <string>YYY</string>
    </dict>

    <key>WorkingDirectory</key>
    <string>/Users/ME</string>

    <key>StandardErrorPath</key>
    <string>/Users/ME/log/backup.log</string>

    <key>StandardOutPath</key>
    <string>/Users/ME/log/backup.log</string>

    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>13</integer>

        <key>Weekday</key>
        <array>
        <integer>1</integer>
        <integer>2</integer>
        <integer>3</integer>
        <integer>4</integer>
        <integer>5</integer>
        </array>
    </dict>
</dict>
</plist>

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

Вы можете поддерживать процесс в рабочем состоянии и проходить родительский pid процесса до тех пор, пока pid предка не станет равным 1, запустить через ps ajx или ps ao pid,ppid,command с grep .

И вкратце:

  • запустить через crontab, /usr/sbin/cron , устарело в launchd.plist
  • запустить через launchd.plist, бинарник в Program или ProgramArguments
  • запустить в Терминале, Terminal.app
  • запускать через ssh, /usr/libexec/sshd-keygen-wrapper или аналогичный
  • запустить через другое приложение, найти его.

Итак, для @n8henrie вам нужно найти фактический двоичный файл.

Еще один способ решить эту проблему, если вы запускаете вещи через launchd: LaunchControl теперь поставляется с помощником с именем fdautil , который вы можете добавить в белый список, а затем запускать команды с помощью fdautil exec . Он будет разрешать только команды, которые вы добавили в белый список через LaunchControl или fdautil set .

Немного информации об этом есть на https://www.soma-zone.com/LaunchControl/FAQ.html , а более подробная информация — в окне справки приложения.

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