Экономный sasl с аутентификацией по имени пользователя и паролю для C++

Я пытался повысить безопасность своего проекта, который использует Apache Thrift. В C# есть класс TSASLClientTransport, который принимает параметры TSocket, имя пользователя и пароль. Точно так же мне нужен класс cpp, чтобы я мог реализовать то же самое в C++.

Я столкнулся с этой задачей https://issues.apache.org/jira/browse/THRIFT-1667, которая все еще находится в открытом состоянии. В этой задаче есть патч. Используя этот патч, я импортировал класс TsaslTransport, но не могу найти здесь имя пользователя / пароль. Если возможно, кто-нибудь может поделиться любыми примерами по этому вопросу

Или есть способ обеспечить простую аутентификацию имени пользователя / пароля в Thrift с использованием C++?

Можно ли использовать Cyrus-SASL здесь?

Любая помощь с благодарностью.

1 ответ

Решение

После некоторого расследования я нашел рабочее решение. Я использовал проект cyrus-sasl вместе с патчем от Apache THRIFT.

Сначала создайте TTransport со службой улья, работающей в безопасном кластере.

boost::shared_ptr<TTransport> socket(new TSocket("hive_host", hive_port));
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));

Создайте массив обратных вызовов, чтобы получить имя пользователя от & simple и пароль от & getsecret в клиенте.

  static sasl_callback_t callbacks[] ={
           {
            SASL_CB_USER, (sasl_callback_ft)&simple, NULL 
           }, {
            SASL_CB_AUTHNAME, (sasl_callback_ft)&simple, NULL 
           }, {
            SASL_CB_PASS, (sasl_callback_ft)&getsecret, NULL
           }, {
            SASL_CB_LIST_END, NULL, NULL
           }
};

Используйте libSaslClient из saslimpl.cpp, чтобы выбрать механизм и сервис. Это инициализирует клиента. И используйте этот клиент в TSaslTransport, чтобы открыть соединение и связаться с сервером.

map<string, string> props; 
sasl::libSaslClient libSaslClient("PLAIN", "", "ldap", "host", props, callbacks);
boost::shared_ptr<TSaslTransport> tsaslTransport(new TSaslTransport(&libSaslClient, transport));
tsaslTransport->open();
tsaslTransport->close();

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

Другие вопросы по тегам