0

Windows Azure に格納されている BLOB へのアクセス許可を管理する、ローカル サーバーで実行される Java アプリケーションを設計しようとしています。クラウド ストレージ リソースは、クラウドでホストされている単一の BLOB コンテナーへの読み取りアクセスと、場合によっては一時的な書き込みアクセスを必要とする複数のモバイル アプリケーション (これも Java で記述されています) によって使用されます。Microsoft Open Technologies の Windows Azure Plugin for Eclipse with Java with Java を使用しています。

私の質問は、Azure に格納されたコンテナー レベルのアクセス ポリシー を、有効期限が切れたときに "アクセスなし" ではなく、以前に格納されたポリシー (読み取り) に戻す方法 (または場合)です。「

MSDN の記事: Java での共有アクセス署名の作成は良い出発点となりますが、コンテナー レベルの格納されたポリシーを使用して Java で共有アクセス ポリシーを管理する方法についてはまだあまり言及されていません。私は Java と SAS を学んでいますが、Access Control for Azure Blobsに似た Java コードの例を見つけることができなかったため、質問を示すために以下に短い Java コードを含めました。

サーバー アプリケーションは、Azure ストレージへの接続に使用されるプライベート ストレージ接続文字列を取得します。クラウド ストレージ アカウントを取得し、クラウド BLOB クライアントを作成します。コンテナーへの参照を取得し、コンテナーがまだ存在しない場合はコンテナーを作成します。(コンテナー名は小文字でなければならないことに注意してください。) 次に、コンテナーの現在のアクセス許可をダウンロードします。(1 つのコンテナーに対して、最大 5 つのコンテナー レベルの格納されたアクセス ポリシーを保存できます。)

たとえば、コンテナー レベルのアクセス許可を制御する "baxter" と "heath" という名前の 2 つの保存されたアクセス ポリシーがあり、コンテナーの保存されたアクセス ポリシーが以前に保存されたときに両方のポリシーが READ (のみ) に設定されたとします。 . これらの初期ポリシーは、読み取り権限があり、数か月後に期限切れになるように設定されています。「ヒース」または「バクスター」ポリシーのいずれかに割り当てられたモバイル アプリケーションは、次のような uri 文字列を介して sascontainer6 に保存されている BLOB への読み取りアクセスから開始します。

http://grassy.blob.core.windows.net/sascontainer6/image4.jpg?sr=c&sv=2012-02-12&sig=5G7EOgiYYNEGmw2Y0T4IUgt%2FzTnmYpaxWfB5nEira08%3D&si=baxter

http://grassy.blob.core.windows.net/sascontainer6/image4.jpg?sr=c&sv=2012-02- 12&sig=llUoAg2PvFUfhO28ncrlheh2RRJdb7smQEX6nO8xoCk%3D&si=heath

必要に応じて、サーバー アプリケーションは、新しい文字列を発行することなく、モバイル アプリケーションのサブセットを読み取り権限と書き込み権限の両方に昇格させることができます。これは、コンテナに保存されている「baxter」ポリシーを変更することで実現できます。コントロールの「粒度」はポリシー レベルであり、ポリシーの更新により、「baxter」ポリシーに割り当てられたすべてのモバイル アプリケーションがコンテナーに BLOB を書き込む (または上書きする) ことができるようになります。「ヘルス」ポリシーに割り当てられたモバイル アプリケーションは続行します。同様に、サーバー アプリケーションは、特定のポリシーに割り当てられたアプリケーションのコンテナーへのすべてのアクセスを取り消すことができます。

ポリシーを変更する前に、サーバー アプリケーションはコンテナーへのパブリック アクセスがオフになっていることを確認します。現在時刻を開始時刻とし、開始時刻から 1 時間後にアクセスの有効期限を指定します。これにより、新しいポリシーに READ および WRITE の両方のアクセス許可が設定されます。最後に、既存の「baxter」ポリシーが新しいポリシーで上書きされます。

generateSharedAccessSignature メソッドは、「baxter」および「heath」ポリシーの共有アクセス署名 (SAS) を取得できます。ポリシーに保存されているアクセス許可を変更しても、SAS は変更されません。また、上記の uri 文字列を使用するアプリケーションは、指定された有効期限まで動作するはずです。

ただし、有効期限に達すると、「baxter」文字列はコンテナーに対するすべてのアクセス許可 (読み取りと書き込みの両方) を失います。しかし、これは私が望んでいることではありません。「baxter」ポリシーに割り当てられたモバイル アプリケーションが READ (のみ) に戻るためのアクセス許可が必要です。有効期限はできるだけ短く、1 時間以内にします。私の特定のアプリケーションでは、許可をより長い期間 READ に設定することは許容されます。

私の質問は、Azure のコンテナー レベルの共有アクセス ポリシーを使用して、トークン (つまり、上記の「baxter」文字列) を「アクセスなし」ではなく代替ポリシー (つまり、READ) に戻すことを許可する方法 (または場合) です。 .」</p>

public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException 
    {           
    Account creds = new Account();              
    final String storageConnectionString = creds.getstorageconnectionstring();
    CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
    CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
    CloudBlobContainer container = blobClient.getContainerReference("sascontainer6");
    container.createIfNotExist();
    BlobContainerPermissions containerPermissions = container.downloadPermissions();
    containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
    SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
    GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
    calendar.setTime(new Date());
    policy.setSharedAccessStartTime(calendar.getTime());
    calendar.add(Calendar.HOUR, 1);
    policy.setSharedAccessExpiryTime(calendar.getTime());
    policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.WRITE));
    containerPermissions.getSharedAccessPolicies().put("baxter", policy);            
    container.uploadPermissions(containerPermissions);
    String sas = container.generateSharedAccessSignature(new SharedAccessBlobPolicy(),"baxter");         
    String sasex = container.generateSharedAccessSignature(new SharedAccessBlobPolicy(),"heath");         
    }
4

1 に答える 1

1

コンテナ レベルのアクセス ポリシーと SAS について十分に理解していることを示します。すべての説明は、非常に具体的な質問につながります。

私の質問は、Azure のコンテナー レベルの共有アクセス ポリシーを使用して、トークン (つまり、上記の「baxter」文字列) を「アクセスなし」ではなく代替ポリシー (つまり、READ) に戻すことを許可する方法 (または場合) です。 .」</p>

どちらの答えですか、残念ながらNOです。fallbackコンテナー レベルのポリシーの有効期限が切れたときに何が起こるかを定義することはできません。期限が切れたら、終わりです。それに関連付けられた SAS は、関連付けられたリソースに対してアクションを実行できません。サーバー側のコードから、新しいアクセス許可と新しい有効期限で再度明示的に上書きする必要があります。

しかし、あなたの概念アーキテクチャに少し挑戦したいと思います。あなたは声明を持っています:

必要に応じて、サーバー アプリケーションは、新しい文字列を発行することなく、モバイル アプリケーションのサブセットを読み取り権限と書き込み権限の両方に昇格させることができます。

たとえあなたserverがそうしたとしても、モバイル クライアントは、そのクラウド ストレージwriteだけでなく、今ではそれができることをどのように理解するのでしょうか? readあなたのモバイルクライアントが常に静かに書き込もうとしているとは思えません。

server-to-mobile-client私の推測では、モバイル クライアントがクラウド ストレージに書き込み可能であることを認識する前に、何らかの通信が行われていると思われます。そのようなコミュニケーションがない場合、何かがひどく壊れています。

ただし、そのような通信が存在する場合、有効期間が短い新しい SAS にRWアクセス許可 (読み取りと書き込み) を提供することを妨げるものは何もありません。この新しい存続期間の短い SAS はstand aloneSAS である場合もあります。つまり、保存されているアクセス ポリシーには関連付けられておらず、ブロブへの書き込みのために特別に発行されます。

man-in-the-middle私の他の推測では、型攻撃を避けるために、ネットワーク経由で SAS を送信することを避けたいということです。むしろ、アプリケーションで SAS を事前に構成したいと考えています。この場合、読み取りと書き込みに個別のアクセス ポリシーを設定することをお勧めします。expired書き込み用のアクセス ポリシーを安全に作成し、必要な場合にのみ有効にすることができます。デバイスには 2 つではなく 4 つの SAS URI がありますが、デバイス (デバイス) は、どのポリシーが読み取り専用で、どのポリシーを使用して書き込みを試行できるかを正確に認識します。有効期限が切れても、書き込みアクセス ポリシーは引き続きコンテナーに関連付けられており、削除されないことに注意してください。したがって、次にアクティブにしたいときに更新するだけです。

于 2013-03-26T10:59:39.153 に答える