В чем разница между аутентификацией и авторизацией в контексте информационной безопасности?

Ответ

Аутентификация (Authentication) и авторизация (Authorization) — это последовательные этапы контроля доступа, часто обозначаемые как AuthN и AuthZ.

  1. Аутентификация (AuthN) — "Кто ты?"

    • Это процесс верификации личности пользователя или системы.
    • Проверяет предоставленные учетные данные (credential) против хранилища данных (например, базы пользователей).
    • Примеры механизмов: Логин/пароль, одноразовые коды (TOTP), аппаратные ключи (YubiKey), биометрия, сертификаты.
    • Результат успешной аутентификации — установление идентификатора (user ID, principal).
  2. Авторизация (AuthZ) — "Что тебе разрешено?"

    • Это процесс проверки прав доступа уже аутентифицированного субъекта к конкретному ресурсу или действию.
    • Определяет, какие операции (чтение, запись, удаление) пользователь может выполнять с объектом (файлом, endpoint, записью в БД).
    • Примеры моделей: Ролевой доступ (RBAC), доступ на основе атрибутов (ABAC), списки контроля доступа (ACL).

Аналогия: Представьте себе офисное здание.

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

Пример кода (упрощенный):

# 1. Аутентификация: Проверяем, кто пользователь
def authenticate(username, password_hash):
    user = db.get_user(username)
    if user and user.password_hash == password_hash:
        return user.id  # Возвращаем идентификатор
    return None

# 2. Авторизация: Проверяем, что пользователь может делать
def authorize(user_id, action, resource):
    user_role = db.get_user_role(user_id)
    # Проверяем права на основе роли (RBAC)
    if action == "DELETE" and user_role != "ADMIN":
        return False  # Отказать в доступе
    if resource == "SALARY_DATA" and user_role not in ["HR", "ADMIN"]:
        return False
    return True  # Разрешить доступ

# Использование
user_id = authenticate("alice", "hashed_password123")
if user_id and authorize(user_id, "VIEW", "PROJECT_REPORT"):
    show_report()

Ответ 18+ 🔞

А, ну вот, опять эти два слова, которые все путают, как хуй с пальцем! Слушай, давай разберёмся, а то голова болит уже от этих «авсентификаций».

Представь себе, ты подходишь к двери какого-нибудь офиса, где сидят важные пидоры в пиджаках. Первое, что ты делаешь — аутентификация (AuthN). Это когда тебя спрашивают: «Ты кто, блядь?». Ты суёшь им свою карточку, палец к сканеру, или, на худой конец, говоришь пароль. Они смотрят в свою базу данных и говорят: «А, так это ты, Вася Пупкин! Ну заходи, Вася». Всё, твоя личность установлена. Это и есть ответ на вопрос «Кто ты?».

А теперь ты внутри. И начинается авторизация (AuthZ). Это когда тебе говорят: «Так, Вася, а что тебе тут можно?». Ты такой: «Хочу в серверную». А они тебе: «А хуй тебе, Вася! У тебя роль „Бухгалтер“, а в серверную только „Админ“ или „Сисадмин с пониженной социальной ответственностью“. Иди-ка ты лучше в бухгалтерию кофе пить». Вот это и есть проверка прав, или «Что тебе разрешено?».

Короче, чтобы было совсем понятно:

  1. AuthN — это когда ты доказываешь, что ты не верблюд.
  2. AuthZ — это когда тебе говорят, что верблюдам в этот холодильник с пивом нельзя, даже если они очень хотят.

Вот, смотри, как это в коде выглядит, чтоб ты не думал, что я пизжу:

# 1. Аутентификация: Узнаём, кто пришёл (или кто приперся)
def authenticate(username, password_hash):
    user = db.get_user(username)
    # Сравниваем хеш пароля. Если совпало — это наш чел.
    if user and user.password_hash == password_hash:
        return user.id  # Возвращаем его внутренний ID, типа "да, это Вася №1488"
    return None  # Не сошлось — иди нахуй, незнакомец.

# 2. Авторизация: Проверяем, куда этому челу можно
def authorize(user_id, action, resource):
    user_role = db.get_user_role(user_id) # Смотрим, кто он по жизни

    # А теперь правила, ёпта! Простая модель RBAC.
    if action == "DELETE" and user_role != "ADMIN":
        return False  # Удалять может только админ! Ты чё, охренел?
    if resource == "SALARY_DATA" and user_role not in ["HR", "ADMIN"]:
        return False  # Зарплаты смотреть? А тебе зачем, любопытная жопа?
    return True  # Ну ладно, проходи, всё можно.

# А теперь применяем эту хуйню на практике
user_id = authenticate("alice", "hashed_password123") # Алиса представилась
if user_id and authorize(user_id, "VIEW", "PROJECT_REPORT"): # Проверили, можно ли ей смотреть отчёт
    show_report() # Можно! Показываем.

Вот и вся магия. Сначала узнаём, кто, а потом решаем, что этому «кто» можно. Не перепутай, а то получится ебушки-воробушки: пустишь кого попало в базу зарплат, а потом будешь чесать репу.