WCF и Silverlight 4.0 в приложении N-Tier: безопасные вызовы службы (без SSL, без защиты сообщений, без x.509)
Наша архитектура представляет собой простую модель N-уровня, которая состоит из приложения ASP.Net, расположенного в IIS7 (размещенного в DiscountASP), которое предоставляет методы для службы WCF. Эти методы общаются с БД с помощью EF4. Клиенты в Silverlight 4.0.
Три важных момента:
Аутентификация и аутентификация не являются проблемой - звонки в службу являются анонимными, и мы не заботимся о личности вызывающего абонента.
Данные, передаваемые в методах, не являются конфиденциальными.
Мы просто хотим убедиться, что никто не может звонить.
Поправьте меня, если неправильно:
Защита сообщений невозможна, поскольку она не поддерживается в Silverlight.
Безопасность транспорта (сертификаты HTTPS и x.509/SSL) также нельзя обеспечить в Silverlight
Итак, шаги, которые мы предпринимаем для обеспечения некоторого уровня безопасности:
Секретный ключ жестко запрограммирован на один из DLL в XAP.
Эта DLL-библиотека закодирована, поэтому ее нельзя перепроектировать.
Секретный ключ отправляется в качестве параметра для всех вызовов метода сервиса.
В начале каждого метода сверяйте секретный ключ с исходным положением в БД.
Удалите конечную точку MetaDataExchange из службы.
Учитывая эту минимальную настройку и ее множество недостатков, самым большим недостатком, вероятно, является тот факт, что передача не защищена (HTTP), и секретный ключ открыт. Итак, вопросы:
Если злонамеренный пользователь хочет нанести вред нашей системе, сколько усилий ему нужно приложить, чтобы извлечь секретный ключ, найти, какие методы раскрыты, и начать их вызывать?
Существуют ли другие WCF-комбинации, которые могут обеспечить базовую защиту учетных данных при каждом вызове (без HTTPS или сертификатов)?
1 ответ
Нет, становится гораздо яснее, что вы подразумеваете под безопасностью в контракте на свой предыдущий вопрос. Безопасность состоит из нескольких аспектов.
Аутентификация и аутентификация не являются проблемой - звонки в службу являются анонимными, и мы не заботимся о личности вызывающего абонента.
Мы просто хотим убедиться, что никто не может звонить.
Это противоречие. Если вы хотите убедиться, что звонки не могут быть выполнены всеми, кто ищет аутентификацию.
- Данные, передаваемые в методах, не являются конфиденциальными.
Учитывая эту минимальную настройку и ее множество недостатков, самым большим недостатком, вероятно, является тот факт, что передача не защищена (HTTP), и секретный ключ открыт.
Еще одно противоречие - вы явно хотите отправить конфиденциальные данные.
Защита сообщений не является опцией для Silverlight - это верно, если мы говорим о шифровании и подписи сообщений, но вы все равно можете передать имя пользователя и пароль в сообщении, если вы используете HTTPS для обеспечения безопасного канала = TransportWithMessageCredential
Сколько нужно усилий, чтобы найти секретный ключ?
- Если вы не используете HTTPS, он найдет всех с базовыми навыками и доступом к сети.
- Если вы поместите ключ в сборку, это, вероятно, потребует больше навыков, но ключ все равно останется (из-за запутывания сложно будет реконструировать логику, но константы должны быть такими же).
Если вы хотите защитить свою передачу и создать безопасное решение, вы должны использовать HTTPS. Silverlight может использовать сервисы, предоставляемые через HTTPS. Вы также можете использовать имя пользователя и пароль для идентификации ваших клиентов. Клиенты будут нести ответственность за сохранение в тайне имени пользователя и пароля, потому что если они этого не сделают, вы увидите, чья учетная запись нанесла вред вашему приложению.