SSLとSASL
SASLがプロトコルではなく、抽象化レイヤーであることは事実です。SSLとSASLが同様の機能を提供していることも事実です。どちらも、認証、データ署名、暗号化を提供します。
SSLはトランスポート層で実行され、通常は下のプロトコルに対して透過的です。たとえば、LDAPまたはHTTPでSSLを使用できます。ただし、場合によっては、セキュリティで保護されたモードに切り替えるために、既存のプロトコルを変更する必要があります。たとえば、POP3とIMAPは、SSLの使用を開始するコマンドSTARTTLSを持つように拡張されています。その観点からすると、これはSASLが行っていることと似ています。
一方、SASL機能を提供するために多くのプロトコルも拡張されています。 これがプロトコルのリストです。繰り返しになりますが、POP3とIMAPはその2つであり、認証を開始するために異なるコマンドを使用しています。
では、SSLをいつ使用する必要があり、SASLをいつ使用する必要があるのでしょうか。
SSLとSASLの明らかな違いは、SASLではクライアントを認証するためにさまざまなメカニズムを選択できるのに対し、SSLは証明書に基づいて認証を行うためにバインドされていることです。SASLでは、GSSAPI、Kerberos、NTLMなどの使用を選択できます。
この違いのために、いくつかの状況があります。SSLではなくSASLを使用する方が直感的です。たとえば、クライアントアプリケーションはKerberosを使用してエンドユーザーを認証しています。サーバーはクライアントを認証する必要があります。クライアントアプリケーションにはすでにKerberosクレデンシャル(Kerberos用語ではチケット)があるため、Kerberosクレデンシャルを使用してサーバーで認証することは理にかなっています。もちろん、SSLを設定して同じことを行うこともできます。ただし、これは、既存のKerberosインフラストラクチャに加えて、認証局インフラストラクチャをセットアップし、クライアント証明書をKerberosクレデンシャルと何らかの方法で関連付ける必要があることを意味します。それは実行可能ですが、多くの作業が必要です。
また、SSLではなくSASLメカニズムでのみ使用できる機能を使用する必要がある場合もあります。たとえば、Kerberosを使用すると、クライアントからサーバーにチケットを転送できるため、サーバーはチケットを使用してクライアントに代わって一部のリソースを照会できます。一般的な例の1つは、アプリケーションサーバーとデータベースがあることです。クライアントアプリケーションはアプリケーションサーバーで認証され、アプリケーションサーバーはクライアントの資格情報を使用してクライアントに代わってデータベースにクエリを実行する必要があります。SSLはこの機能を提供できませんが、Kerberosはこれをサポートしています。したがって、その場合は、SASLの使用を選択する必要があります。
場合によっては、SSLは使用したいが、SASLは使用したくないことがあります。たとえば、プロトコルを拡張することはオプションではありません。または、プロトコルの下で交換されるすべてのパケットを暗号化する必要があります。
GSSAPIはKerberosおよびSASLとどのように関連していますか
このwikiページによると、GSSAPIとKerberosの両方がSASLでサポートされているメカニズムです。GSSAPIは、ジェネリックプログラミングインターフェイスです。アイデアは、アプリケーションライターが、下で使用されているプロトコルに関係なく、単一の共通APIを使用して認証や暗号化などを実行できるようにすることです。GSSAPIはKerberosを実装します。したがって、GSSAPIを使用してKerberos認証を行うことができます。
JAASはSASLとどのように関連していますか
正直なところ、私はJavaの専門家ではありません。私が読んだところによると、JAASは単なるプラグ可能な認証フレームワークのようです。私はその考えがGSSAPIに似ていると信じています。使用している認証方法に関係なく、単一のプログラミングインターフェイスを提供することです。GSSAPIは認証と安全なメッセージ交換に重点を置いていますが、JAASは認証と承認に重点を置いています。JAASもSASLメカニズムの1つであるという証拠は見つかりません。カスタムSASLメカニズムの実装を支援するJavaライブラリのヘルパークラスがいくつかあるはずです。カスタムSASLメカニズムを実装する場合、JAASを使用するのが理にかなっている場合があります。