Как исправить ошибку 403 «Отказ в доступе» при попытке доступа к файлам из Google Cloud Storage - PullRequest
0 голосов
/ 02 января 2019

Проблема

При попытке загрузить статический контент для моего веб-приложения из корзины Google Cloud Storage несколько файлов возвращают код ответа 403, а все остальные загружаютсяуспешно.

Настройка

Приложение представляет собой приложение Python (3.7) на основе Django (2.1.3), размещенное в Google App Engine и использующее учетные данные учетной записи службы, которыебыли предоставлены разрешения редактора в IAM.Мы используем Bootstrap 3.3.7 для нашего внешнего интерфейса, размещая его исходные файлы в нашей корзине GCS, и плагин django-storages (1.7.1) для взаимодействия с GCS API.

Проблемные файлы - изображения Glyphicon.предоставляется с Bootstrap, а также с картой CSS.Все остальные ресурсы Bootstrap загружаются без проблем.Я пытался:

  1. Предоставление учетной записи службы многочисленных комбинаций разрешений IAM
  2. Воссоздание учетной записи службы и файла ключа, который мы используем для ее аутентификации
  3. Отключение иповторное включение API облачного хранилища Google
  4. Создание нового сегмента и перезагрузка всех статических файлов в него с использованием учетных данных учетной записи службы
  5. Предоставление AllUsers доступа на чтение к проблемным файлам (так как в настоящее время установлены политики))
  6. Предоставление доступа AllUsers для чтения ко всей корзине

Последняя попытка исправить (# 6) разрешила доступ к глификонам, но не является приемлемым решением.

Код

Статический путь к файлу / конфигурация GCP в нашей политике settings.py:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
# If on GAE, use STATIC_ROOT; local, use STATICFILES_DIRS
STATIC_URL = '/static/'
if os.getenv('GAE_ENV', '').startswith('standard'):
    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
else:
    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static/')]

# Media url
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media/')

# Google Cloud Platform Settings (Storage & Authentication)
# Authentication
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.path.join(BASE_DIR, 'conf/vwa.json')
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
os.path.join(BASE_DIR, 'conf/vwa.json')
)
# File Storage
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = os.getenv('GS_BUCKET_NAME', '')
# Static Storage
STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'

IAM для корзины:

{
  "bindings": [
    {
      "members": [
        "serviceAccount:SERVICEACCOUNTADDRESS"
      ], 
      "role": "roles/storage.admin"
    }, 
    {
      "members": [
        "projectEditor:PROJECTNAME", 
        "projectOwner:PROJECTNAME"
      ], 
      "role": "roles/storage.legacyBucketOwner"
    }, 
    {
      "members": [
        "projectViewer:PROJECTNAME"
      ], 
      "role": "roles/storage.legacyBucketReader"
    }
  ], 
  "etag": "CAI="
}

Политика ACL для сегмента:

[
  {
    "entity": "project-editors-649435531377",
    "projectTeam": {
      "projectNumber": "649435531377",
      "team": "editors"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-owners-649435531377",
    "projectTeam": {
      "projectNumber": "649435531377",
      "team": "owners"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-viewers-649435531377",
    "projectTeam": {
      "projectNumber": "649435531377",
      "team": "viewers"
    },
    "role": "READER"
  }
]

Политика IAM для глициконов:

{
  "bindings": [
    {
      "members": [
        "projectOwner:PROJECTNAME", 
        "projectEditor:PROJECTNAME", 
        "serviceAccount:SERVICEACCOUNTADDRESS", 
        "allUsers"
      ], 
      "role": "roles/storage.legacyObjectOwner"
    }, 
    {
      "members": [
        "projectViewer:PROJECTNAME", 
        "allAuthenticatedUsers"
      ], 
      "role": "roles/storage.legacyObjectReader"
    }
  ], 
  "etag": "CAQ="
}

Политика ACL для глификонов:

[
  {
    "entity": "project-owners-649435531377",
    "projectTeam": {
      "projectNumber": "649435531377",
      "team": "owners"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-editors-649435531377",
    "projectTeam": {
      "projectNumber": "649435531377",
      "team": "editors"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-viewers-649435531377",
    "projectTeam": {
      "projectNumber": "649435531377",
      "team": "viewers"
    },
    "role": "READER"
  },
  {
    "email": "SERVICEACCOUNTADDRESS",
    "entity": "user-SERVICEACCOUNTADDRESS",
    "role": "OWNER"
  },
  {
    "entity": "allAuthenticatedUsers",
    "role": "READER"
  },
  {
    "entity": "allUsers",
    "role": "OWNER"
  }
]

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

...