sql server-sqlsrv_connect(PHP)に、提供された資格情報でWindows認証を使用するように強制できますか?
セットアップ:イントラネットSQLServerとドメインコントローラー。 DMZには、Webサーバー(IIS、PHP7)があります。
SQLServerには混合モード認証があります。古いAPIセットアップ(PHP5、mssql_connect)から新しいセットアップ(PHP7、IIS)に移行しようとしています。
古いAPI設定では、認証は提供されたユーザー名とパスワードを使用してmssql_connectを介して行われ、問題なくSQLサーバーに接続します。ユーザー名とパスワードはDOMAINクレデンシャルであり、SQLSERVERでGROUPSとして設定されます。これにより、ユーザーの追加/削除がはるかに簡単になり、非常にうまく機能します。
新しいAPIセットアップの試み#1: --sqlsrv_connect:ユーザー名とパスワードを指定すると、sqlsrv_connectはWINDOWS認証の代わりにSQLUSER認証を使用するように強制されます。ユーザーはドメインにいますが、SQL SERVERに直接割り当てられていないため、これは失敗します。
試行#2: --sqlsrv_connect:ユーザー名とパスワードを指定しないと、sqlsrv_connectは設定された資格情報(必要なものではありません)を使用してWindows認証を介して接続します。はい、これらの資格情報を任意に設定できますが、ユーザー名をチェックするSQL SERVER内のストアドプロシージャは、実際のクライアントユーザー名ではなく、「設定されたユーザー」を返す可能性があります。
試行#3: --PDO:sqlsrv:-ユーザー名の有無にかかわらず同じこと。
試行#4: -LDAP認証(クレデンシャルあり)を実行してから、sqlsrv_connect(クレデンシャルなし)を実行します。これにより、ユーザーがデータベースにアクセスできる必要があることを確認できますが、ストアドプロシージャ内からユーザー名を確認することはできません。
私はグーグル、スタックオーバーフロー、および他の場所からこのトピックに関する多くの投稿を読みました。それらのどれも、データベースにアクセスできる資格情報をWEBSERVER自体に持たせたくないDMZでホストされているAPIを持っていることに対処していません。必要なのは、USER SUPPLIED資格情報がAPI(Webサーバー)を介して「Windows認証」として(SQLユーザーとしてではなく)SQLサーバーに渡されることです。このようにして、SQLサーバーへのクエリはすべてユーザーとして実行され、ディレクトリを介してユーザーを管理できます。
ほとんどの投稿は、ユーザーがSQL USER認証をあきらめて(管理上の問題のように聞こえます)、またはWebサーバーからSQLサーバーへの匿名アクセスを有効にした(DMZのWebサーバーでは悪い考えのようです)と推測しています。 。
これが機能することを期待して、私は完全にロッカーから離れていますか?これが標準的なSOの質問ではないことは知っていますが、他にどこに置くべきかわかりません。上記が行われている投稿/ページを知っている場合(明示的なクレデンシャルを使用してsqlsrvを使用してWindows認証に接続する)、共有してください。
ありがとうございます。
答え :
解決策:
これは通常、Kerberosの制約付き委任を使用して行われます。
これには、WebサイトでWindows認証(NTLMではなくKerberos)を使用する必要があり、Webサイトはユーザーの資格情報にアクセスできません。それがPHPでどのように機能するか、そしてそれが機能するかどうかはわかりません。ただし、ASP.NETでセットアップして実行する方法については多くの情報があります。基本的に、IISには、偽装に使用できるトークンがあります。
フォームまたは基本認証で資格情報を受け入れていて、それらを使用してWindowsAuthを使用してSQLServerに接続する場合は、それらを接続文字列に貼り付けることはできません。偽装を使用してスレッドのセキュリティコンテキストを変更する必要があります。
最初に、資格情報を使用して、 LoginUserAPIで実際のログオンを実行します。次に、返されたハンドルを使用してImpersonateLoggedOnUserを実行します。その後、Windows統合認証を使用してSQLServerに接続できます。リクエストの最後に、 RevertToSelf を呼び出して、リクエストしているエンドユーザーとしての実行を停止します。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。