যদি আপনার অ্যাপ ব্যবহারকারীদের Google ব্যবহার করে তাদের অ্যাকাউন্টে সাইন ইন করতে দেয়, তাহলে আপনি ক্রস-অ্যাকাউন্ট সুরক্ষা পরিষেবা দ্বারা প্রদত্ত সুরক্ষা ইভেন্ট বিজ্ঞপ্তিগুলি শুনে এবং সাড়া দিয়ে এই শেয়ার করা ব্যবহারকারীদের অ্যাকাউন্টগুলির নিরাপত্তা উন্নত করতে পারেন।
এই বিজ্ঞপ্তিগুলি আপনার ব্যবহারকারীদের Google অ্যাকাউন্টে বড় ধরনের পরিবর্তন সম্পর্কে আপনাকে সতর্ক করে, যা প্রায়শই আপনার অ্যাপের সাথে থাকা তাদের অ্যাকাউন্টের জন্য নিরাপত্তার প্রভাব ফেলতে পারে। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারীর Google অ্যাকাউন্ট হাইজ্যাক করা হয়, তাহলে ইমেল অ্যাকাউন্ট পুনরুদ্ধার বা একক সাইন-অন ব্যবহারের মাধ্যমে ব্যবহারকারীর অ্যাকাউন্ট আপনার অ্যাপের সাথে আপস করার সম্ভাবনা রয়েছে।
এই ধরনের ঘটনার ঝুঁকি কমাতে সাহায্য করার জন্য, Google আপনার পরিষেবার বস্তুগুলিকে "সিকিউরিটি ইভেন্ট টোকেন" পাঠায়। এই টোকেনগুলি খুব কম তথ্য প্রকাশ করে - কেবল নিরাপত্তা ইভেন্টের ধরণ এবং কখন এটি ঘটেছিল, এবং প্রভাবিত ব্যবহারকারীর শনাক্তকারী - তবে আপনি প্রতিক্রিয়া হিসাবে যথাযথ ব্যবস্থা নিতে এগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারীর Google অ্যাকাউন্টের সাথে আপোস করা হয়, তাহলে আপনি সেই ব্যবহারকারীর জন্য সাময়িকভাবে Google দিয়ে সাইন ইন বন্ধ করতে পারেন এবং ব্যবহারকারীর Gmail ঠিকানায় অ্যাকাউন্ট পুনরুদ্ধারের ইমেল পাঠানো থেকে বিরত রাখতে পারেন।
ক্রস-অ্যাকাউন্ট সুরক্ষা RISC স্ট্যান্ডার্ডের উপর ভিত্তি করে তৈরি, যা OpenID ফাউন্ডেশনে তৈরি করা হয়েছে।
সংক্ষিপ্ত বিবরণ
আপনার অ্যাপ বা পরিষেবার সাথে ক্রস-অ্যাকাউন্ট সুরক্ষা ব্যবহার করতে, আপনাকে নিম্নলিখিত কাজগুলি সম্পন্ন করতে হবে:
আপনার প্রকল্পটি এখানে সেট আপ করুন API Console.
একটি ইভেন্ট রিসিভার এন্ডপয়েন্ট তৈরি করুন, যেখানে গুগল নিরাপত্তা ইভেন্ট টোকেন পাঠাবে। এই এন্ডপয়েন্টটি প্রাপ্ত টোকেনগুলি যাচাই করার জন্য এবং তারপরে আপনার পছন্দ মতো নিরাপত্তা ইভেন্টগুলিতে প্রতিক্রিয়া জানানোর জন্য দায়ী।
নিরাপত্তা ইভেন্ট টোকেন পেতে Google-এ আপনার এন্ডপয়েন্ট নিবন্ধন করুন।
পূর্বশর্ত
আপনি কেবলমাত্র সেইসব Google ব্যবহারকারীদের জন্য নিরাপত্তা ইভেন্ট টোকেন পাবেন যারা আপনার পরিষেবার প্রোফাইল তথ্য বা ইমেল ঠিকানা অ্যাক্সেস করার অনুমতি দিয়েছেন। আপনি profile বা email স্কোপ অনুরোধ করে এই অনুমতি পাবেন। নতুন সাইন ইন উইথ গুগল বা লিগ্যাসি গুগল সাইন-ইন SDK গুলি ডিফল্টভাবে এই স্কোপগুলির জন্য অনুরোধ করে, কিন্তু আপনি যদি ডিফল্ট সেটিংস ব্যবহার না করেন, অথবা আপনি যদি সরাসরি Google এর OpenID Connect এন্ডপয়েন্ট অ্যাক্সেস করেন, তাহলে নিশ্চিত করুন যে আপনি এই স্কোপগুলির মধ্যে অন্তত একটির জন্য অনুরোধ করছেন।
একটি প্রকল্প স্থাপন করুন API Console
নিরাপত্তা ইভেন্ট টোকেন গ্রহণ শুরু করার আগে, আপনাকে একটি পরিষেবা অ্যাকাউন্ট তৈরি করতে হবে এবং আপনারAPI Console প্রকল্প। আপনাকে অবশ্যই একই ব্যবহার করতে হবেAPI Console আপনার অ্যাপে Google সাইন-ইনের মতো Google পরিষেবা অ্যাক্সেস করার জন্য আপনি যে প্রকল্পটি ব্যবহার করেন।
পরিষেবা অ্যাকাউন্ট তৈরি করতে:
খুলুন API ConsoleCredentials page . অনুরোধ করা হলে, নির্বাচন করুনAPI Consoleআপনার অ্যাপে Google পরিষেবা অ্যাক্সেস করার জন্য আপনি যে প্রকল্পটি ব্যবহার করেন।
ক্রেডেনশিয়াল তৈরি করুন > পরিষেবা অ্যাকাউন্ট ক্লিক করুন।
এই নির্দেশাবলী অনুসরণ করে RISC কনফিগারেশন অ্যাডমিন রোল (
roles/riscconfigs.admin) দিয়ে একটি নতুন পরিষেবা অ্যাকাউন্ট তৈরি করুন।আপনার নতুন তৈরি করা পরিষেবা অ্যাকাউন্টের জন্য একটি কী তৈরি করুন। JSON কী টাইপটি বেছে নিন এবং তারপর তৈরি করুন এ ক্লিক করুন। কীটি তৈরি হয়ে গেলে, আপনি একটি JSON ফাইল ডাউনলোড করবেন যাতে আপনার পরিষেবা অ্যাকাউন্টের শংসাপত্র থাকবে। এই ফাইলটি কোথাও নিরাপদে রাখুন, তবে আপনার ইভেন্ট রিসিভার এন্ডপয়েন্টে অ্যাক্সেসযোগ্যও।
আপনার প্রোজেক্টের ক্রেডেনশিয়াল পৃষ্ঠায় থাকাকালীন, আপনি যে ক্লায়েন্ট আইডিগুলি ব্যবহার করেন সেগুলিও নোট করুন গুগলের সাথে সাইন ইন বা গুগল সাইন-ইন (লিগেসি) এর জন্য। সাধারণত, আপনার সমর্থিত প্রতিটি প্ল্যাটফর্মের জন্য আপনার একটি ক্লায়েন্ট আইডি থাকে। পরবর্তী বিভাগে বর্ণিত সুরক্ষা ইভেন্ট টোকেনগুলি যাচাই করার জন্য আপনার এই ক্লায়েন্ট আইডিগুলির প্রয়োজন হবে।
RISC API সক্রিয় করতে:
RISC API পৃষ্ঠাটি খুলুনAPI Console। নিশ্চিত করুন যে আপনি Google পরিষেবাগুলি অ্যাক্সেস করার জন্য যে প্রকল্পটি ব্যবহার করেন তা এখনও নির্বাচিত আছে।
RISC শর্তাবলী পড়ুন এবং নিশ্চিত করুন যে আপনি প্রয়োজনীয়তাগুলি বুঝতে পেরেছেন।
যদি আপনি কোনও প্রতিষ্ঠানের মালিকানাধীন কোনও প্রকল্পের জন্য API সক্ষম করেন, তাহলে নিশ্চিত করুন যে আপনি আপনার প্রতিষ্ঠানকে RISC শর্তাবলীর সাথে আবদ্ধ করার জন্য অনুমোদিত।
RISC শর্তাবলীতে সম্মত হলেই কেবল সক্ষম করুন -এ ক্লিক করুন।
একটি ইভেন্ট রিসিভার এন্ডপয়েন্ট তৈরি করুন
গুগল থেকে নিরাপত্তা ইভেন্টের বিজ্ঞপ্তি পেতে, আপনাকে একটি HTTPS এন্ডপয়েন্ট তৈরি করতে হবে যা HTTPS POST অনুরোধগুলি পরিচালনা করে। আপনি এই এন্ডপয়েন্টটি নিবন্ধন করার পরে (নীচে দেখুন), গুগল এন্ডপয়েন্টে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত স্ট্রিং পোস্ট করা শুরু করবে যাকে নিরাপত্তা ইভেন্ট টোকেন বলা হয়। নিরাপত্তা ইভেন্ট টোকেন হল স্বাক্ষরিত JWT যা একটি একক নিরাপত্তা-সম্পর্কিত ইভেন্ট সম্পর্কে তথ্য ধারণ করে।
আপনার এন্ডপয়েন্টে প্রাপ্ত প্রতিটি সিকিউরিটি ইভেন্ট টোকেনের জন্য, প্রথমে টোকেনটি যাচাই করুন এবং ডিকোড করুন, তারপর আপনার পরিষেবার জন্য উপযুক্ত সুরক্ষা ইভেন্টটি পরিচালনা করুন। খারাপ অভিনেতাদের কাছ থেকে দূষিত আক্রমণ প্রতিরোধ করার জন্য ডিকোডিংয়ের আগে ইভেন্ট টোকেনটি যাচাই করা অপরিহার্য । নিম্নলিখিত বিভাগগুলি এই কাজগুলি বর্ণনা করে:
১. নিরাপত্তা ইভেন্ট টোকেনটি ডিকোড এবং যাচাই করুন
যেহেতু সিকিউরিটি ইভেন্ট টোকেনগুলি একটি নির্দিষ্ট ধরণের JWT, তাই আপনি যেকোনো JWT লাইব্রেরি ব্যবহার করতে পারেন, যেমন jwt.io তে তালিকাভুক্ত একটি, সেগুলিকে ডিকোড এবং যাচাই করার জন্য। আপনি যে লাইব্রেরিই ব্যবহার করুন না কেন, আপনার টোকেন বৈধতা কোডটি নিম্নলিখিতগুলি করতে হবে:
- গুগলের RISC কনফিগারেশন ডকুমেন্ট থেকে ক্রস-অ্যাকাউন্ট সুরক্ষা ইস্যুকারী শনাক্তকারী (
issuer) এবং স্বাক্ষরকারী কী সার্টিফিকেট URI (jwks_uri) পান, যা আপনিhttps://accounts.google.com/.well-known/risc-configurationএ পাবেন। - আপনার পছন্দের JWT লাইব্রেরি ব্যবহার করে, নিরাপত্তা ইভেন্ট টোকেনের হেডার থেকে সাইনিং কী আইডিটি পান।
- গুগলের সাইনিং কী সার্টিফিকেট ডকুমেন্ট থেকে, আগের ধাপে আপনি যে কী আইডিটি পেয়েছেন তার সাথে পাবলিক কীটি পান। যদি ডকুমেন্টে আপনার পছন্দের আইডি সহ কোনও কী না থাকে, তাহলে সম্ভবত নিরাপত্তা ইভেন্ট টোকেনটি অবৈধ এবং আপনার এন্ডপয়েন্টটি HTTP ত্রুটি 400 ফেরত দেবে।
- আপনার পছন্দের JWT লাইব্রেরি ব্যবহার করে, নিম্নলিখিতগুলি যাচাই করুন:
- পূর্ববর্তী ধাপে আপনি যে পাবলিক কীটি পেয়েছেন তা ব্যবহার করে নিরাপত্তা ইভেন্ট টোকেনটি স্বাক্ষরিত হয়।
- টোকেনের
audদাবিটি আপনার অ্যাপের ক্লায়েন্ট আইডিগুলির মধ্যে একটি। - টোকেনের
issদাবিটি RISC আবিষ্কারের নথি থেকে প্রাপ্ত ইস্যুকারী শনাক্তকারীর সাথে মিলে যায়। মনে রাখবেন যে আপনাকে টোকেনের মেয়াদ (exp) যাচাই করতে হবে না কারণ সুরক্ষা ইভেন্ট টোকেনগুলি ঐতিহাসিক ঘটনাগুলিকে প্রতিনিধিত্ব করে এবং তাই, মেয়াদ শেষ হয় না।
উদাহরণস্বরূপ:
জাভা
java-jwt এবং jwks-rsa-java ব্যবহার করে:
public DecodedJWT validateSecurityEventToken(String token) {
DecodedJWT jwt = null;
try {
// In a real implementation, get these values from
// https://accounts.google.com/.well-known/risc-configuration
String issuer = "accounts.google.com";
String jwksUri = "https://www.googleapis.com/oauth2/v3/certs";
// Get the ID of the key used to sign the token.
DecodedJWT unverifiedJwt = JWT.decode(token);
String keyId = unverifiedJwt.getKeyId();
// Get the public key from Google.
JwkProvider googleCerts = new UrlJwkProvider(new URL(jwksUri), null, null);
PublicKey publicKey = googleCerts.get(keyId).getPublicKey();
// Verify and decode the token.
Algorithm rsa = Algorithm.RSA256((RSAPublicKey) publicKey, null);
JWTVerifier verifier = JWT.require(rsa)
.withIssuer(issuer)
// Get your apps' client IDs from the API console:
// https://console.developers.google.com/apis/credentials?project=_
.withAudience("123456789-abcedfgh.apps.googleusercontent.com",
"123456789-ijklmnop.apps.googleusercontent.com",
"123456789-qrstuvwx.apps.googleusercontent.com")
.acceptLeeway(Long.MAX_VALUE) // Don't check for expiration.
.build();
jwt = verifier.verify(token);
} catch (JwkException e) {
// Key not found. Return HTTP 400.
} catch (InvalidClaimException e) {
} catch (JWTDecodeException exception) {
// Malformed token. Return HTTP 400.
} catch (MalformedURLException e) {
// Invalid JWKS URI.
}
return jwt;
}
পাইথন
import json
import jwt # pip install pyjwt
import requests # pip install requests
def validate_security_token(token, client_ids):
# Get Google's RISC configuration.
risc_config_uri = 'https://accounts.google.com/.well-known/risc-configuration'
risc_config = requests.get(risc_config_uri).json()
# Get the public key used to sign the token.
google_certs = requests.get(risc_config['jwks_uri']).json()
jwt_header = jwt.get_unverified_header(token)
key_id = jwt_header['kid']
public_key = None
for key in google_certs['keys']:
if key['kid'] == key_id:
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key))
if not public_key:
raise Exception('Public key certificate not found.')
# In this situation, return HTTP 400
# Decode the token, validating its signature, audience, and issuer.
try:
token_data = jwt.decode(token, public_key, algorithms='RS256',
options={'verify_exp': False},
audience=client_ids, issuer=risc_config['issuer'])
except:
raise
# Validation failed. Return HTTP 400.
return token_data
# Get your apps' client IDs from the API console:
# https://console.developers.google.com/apis/credentials?project=_
client_ids = ['123456789-abcedfgh.apps.googleusercontent.com',
'123456789-ijklmnop.apps.googleusercontent.com',
'123456789-qrstuvwx.apps.googleusercontent.com']
token_data = validate_security_token(token, client_ids)
যদি টোকেনটি বৈধ থাকে এবং সফলভাবে ডিকোড করা হয়ে থাকে, তাহলে HTTP স্ট্যাটাস 202 ফেরত দিন। তারপর, টোকেন দ্বারা নির্দেশিত নিরাপত্তা ইভেন্টটি পরিচালনা করুন।
২. নিরাপত্তা সংক্রান্ত ঘটনা পরিচালনা করুন
ডিকোড করা হলে, একটি নিরাপত্তা ইভেন্ট টোকেন নিম্নলিখিত উদাহরণের মতো দেখায়:
{
"iss": "https://accounts.google.com/",
"aud": "123456789-abcedfgh.apps.googleusercontent.com",
"iat": 1508184845,
"jti": "756E69717565206964656E746966696572",
"events": {
"https://schemas.openid.net/secevent/risc/event-type/account-disabled": {
"subject": {
"subject_type": "iss-sub",
"iss": "https://accounts.google.com/",
"sub": "7375626A656374"
},
"reason": "hijacking"
}
}
}
iss এবং aud দাবিগুলি টোকেনের ইস্যুকারী (Google) এবং টোকেনের প্রাপক (আপনার পরিষেবা) কে নির্দেশ করে। আপনি পূর্ববর্তী ধাপে এই দাবিগুলি যাচাই করেছেন।
jti দাবি হল এমন একটি স্ট্রিং যা একটি একক নিরাপত্তা ইভেন্ট সনাক্ত করে এবং স্ট্রিমের জন্য অনন্য। আপনি কোন নিরাপত্তা ইভেন্টগুলি পেয়েছেন তা ট্র্যাক করতে এই শনাক্তকারী ব্যবহার করতে পারেন।
events দাবিতে টোকেনটি যে সুরক্ষা ইভেন্টটি উপস্থাপন করে সে সম্পর্কে তথ্য থাকে। এই দাবিটি একটি ইভেন্ট টাইপ শনাক্তকারী থেকে একটি subject দাবির ম্যাপিং, যা এই ইভেন্টটি কোন ব্যবহারকারীর সাথে সম্পর্কিত তা নির্দিষ্ট করে এবং ইভেন্ট সম্পর্কে উপলব্ধ যেকোনো অতিরিক্ত বিবরণের সাথে সম্পর্কিত।
subject দাবিটি ব্যবহারকারীর অনন্য Google অ্যাকাউন্ট আইডি ( sub ) দিয়ে একজন নির্দিষ্ট ব্যবহারকারীকে শনাক্ত করে। এই Google অ্যাকাউন্ট আইডিটি হল নতুন Sign In With Google ( Javascript , HTML ) লাইব্রেরি, লিগ্যাসি Google সাইন-ইন লাইব্রেরি, অথবা OpenID Connect দ্বারা জারি করা JWT আইডি টোকেনে থাকা একই শনাক্তকারী ( sub )। যখন দাবির subject_type id_token_claims হয়, তখন এতে ব্যবহারকারীর ইমেল ঠিকানা সহ একটি email ক্ষেত্রও অন্তর্ভুক্ত থাকতে পারে।
নির্দিষ্ট ব্যবহারকারীর অ্যাকাউন্টে ইভেন্টের ধরণের জন্য যথাযথ ব্যবস্থা নিতে events দাবির তথ্য ব্যবহার করুন।
OAuth টোকেন শনাক্তকারী
পৃথক টোকেন সম্পর্কিত OAuth ইভেন্টের জন্য, টোকেন বিষয় শনাক্তকারী ধরণের মধ্যে নিম্নলিখিত ক্ষেত্রগুলি থাকে:
token_type: শুধুমাত্রrefresh_tokenসমর্থিত।token_identifier_alg: সম্ভাব্য মানগুলির জন্য নীচের টেবিলটি দেখুন।token: নীচের টেবিলটি দেখুন।
| টোকেন_আইডেন্টিফায়ার_অ্যালগ | টোকেন |
|---|---|
prefix | টোকেনের প্রথম ১৬টি অক্ষর। |
hash_base64_sha512_sha512 | SHA-512 ব্যবহার করে টোকেনের ডাবল হ্যাশ। |
যদি আপনি এই ইভেন্টগুলির সাথে একীভূত হন, তাহলে ইভেন্টটি পাওয়ার পরে দ্রুত মিল নিশ্চিত করার জন্য এই সম্ভাব্য মানগুলির উপর ভিত্তি করে আপনার টোকেনগুলিকে সূচী করার পরামর্শ দেওয়া হচ্ছে।
সমর্থিত ইভেন্টের ধরণ
ক্রস-অ্যাকাউন্ট সুরক্ষা নিম্নলিখিত ধরণের নিরাপত্তা ইভেন্টগুলিকে সমর্থন করে:
| ইভেন্টের ধরণ | গুণাবলী | কিভাবে সাড়া দেবেন |
|---|---|---|
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked | প্রয়োজনীয় : ব্যবহারকারীর বর্তমানে খোলা সেশনগুলি শেষ করে তাদের অ্যাকাউন্ট পুনরায় সুরক্ষিত করুন। | |
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked | প্রয়োজনীয় : যদি টোকেনটি গুগল সাইন-ইনের জন্য হয়, তাহলে বর্তমানে খোলা সেশনগুলি বন্ধ করুন। অতিরিক্তভাবে, আপনি ব্যবহারকারীকে একটি বিকল্প সাইন-ইন পদ্ধতি সেট আপ করার পরামর্শ দিতে পারেন। প্রস্তাবিত : যদি টোকেনটি অন্য Google API-তে অ্যাক্সেসের জন্য হয়, তাহলে আপনার সংরক্ষিত ব্যবহারকারীর যেকোনো OAuth টোকেন মুছে ফেলুন। | |
https://schemas.openid.net/secevent/oauth/event-type/token-revoked | টোকেন শনাক্তকারীর জন্য OAuth টোকেন শনাক্তকারী বিভাগটি দেখুন। | প্রয়োজনীয় : যদি আপনি সংশ্লিষ্ট রিফ্রেশ টোকেনটি সংরক্ষণ করেন, তাহলে এটি মুছে ফেলুন এবং পরের বার অ্যাক্সেস টোকেনের প্রয়োজন হলে ব্যবহারকারীকে পুনরায় সম্মতি দেওয়ার জন্য অনুরোধ করুন। |
https://schemas.openid.net/secevent/risc/event-type/account-disabled | reason=hijacking ,reason=bulk-account | প্রয়োজনীয় : যদি অ্যাকাউন্টটি নিষ্ক্রিয় করার কারণ হয় প্রস্তাবিত : যদি অ্যাকাউন্টটি বন্ধ করার কারণটি প্রস্তাবিত : যদি কোনও কারণ না দেওয়া হয়, তাহলে ব্যবহারকারীর জন্য গুগল সাইন-ইন বন্ধ করুন এবং ব্যবহারকারীর গুগল অ্যাকাউন্টের সাথে সম্পর্কিত ইমেল ঠিকানা ব্যবহার করে অ্যাকাউন্ট পুনরুদ্ধার বন্ধ করুন (সাধারণত, তবে অগত্যা নয়, একটি জিমেইল অ্যাকাউন্ট)। ব্যবহারকারীকে একটি বিকল্প সাইন-ইন পদ্ধতি অফার করুন। |
https://schemas.openid.net/secevent/risc/event-type/account-enabled | প্রস্তাবিত : ব্যবহারকারীর জন্য গুগল সাইন-ইন পুনরায় সক্ষম করুন এবং ব্যবহারকারীর গুগল অ্যাকাউন্ট ইমেল ঠিকানা দিয়ে অ্যাকাউন্ট পুনরুদ্ধার পুনরায় সক্ষম করুন। | |
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required | প্রস্তাবিত : আপনার পরিষেবাতে সন্দেহজনক কার্যকলাপ লক্ষ্য করুন এবং যথাযথ ব্যবস্থা নিন। | |
https://schemas.openid.net/secevent/risc/event-type/verification | অবস্থা = state | প্রস্তাবিত : একটি পরীক্ষামূলক টোকেন গৃহীত হয়েছে তা লগ করুন। |
ডুপ্লিকেট এবং মিস করা ইভেন্ট
ক্রস-অ্যাকাউন্ট সুরক্ষা এমন ইভেন্টগুলিকে পুনরায় ডেলিভার করার চেষ্টা করবে যা তাদের বিশ্বাস ডেলিভার করা হয়নি। অতএব, আপনি কখনও কখনও একই ইভেন্টটি একাধিকবার পেতে পারেন। যদি এর ফলে বারবার এমন ক্রিয়া ঘটে যা আপনার ব্যবহারকারীদের অসুবিধার কারণ হতে পারে, তাহলে ইভেন্টগুলিকে ডি-ডুপ করার জন্য jti দাবি (যা একটি ইভেন্টের জন্য একটি অনন্য শনাক্তকারী) ব্যবহার করার কথা বিবেচনা করুন। Google Cloud Dataflow এর মতো বহিরাগত সরঞ্জাম রয়েছে যা আপনাকে ডি-ডুপ ডেটাফ্লো কার্যকর করতে সাহায্য করতে পারে।
মনে রাখবেন যে ইভেন্টগুলি সীমিত পুনঃপ্রচেষ্টার মাধ্যমে বিতরণ করা হয় তাই যদি আপনার রিসিভার দীর্ঘ সময়ের জন্য বন্ধ থাকে তবে আপনি কিছু ইভেন্ট স্থায়ীভাবে মিস করতে পারেন।
আপনার রিসিভার নিবন্ধন করুন
নিরাপত্তা ইভেন্টগুলি গ্রহণ শুরু করতে, RISC API ব্যবহার করে আপনার রিসিভার এন্ডপয়েন্ট নিবন্ধন করুন। RISC API-তে কল করার সাথে একটি অনুমোদন টোকেন থাকতে হবে।
আপনি শুধুমাত্র আপনার অ্যাপের ব্যবহারকারীদের জন্য নিরাপত্তা ইভেন্ট পাবেন, তাই নীচে বর্ণিত পদক্ষেপগুলির জন্য আপনার GCP প্রকল্পে একটি OAuth সম্মতি স্ক্রিন কনফিগার করা প্রয়োজন।
১. একটি অনুমোদন টোকেন তৈরি করুন
RISC API-এর জন্য একটি অনুমোদন টোকেন তৈরি করতে, নিম্নলিখিত দাবিগুলি সহ একটি JWT তৈরি করুন:
{
"iss": SERVICE_ACCOUNT_EMAIL,
"sub": SERVICE_ACCOUNT_EMAIL,
"aud": "https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService",
"iat": CURRENT_TIME,
"exp": CURRENT_TIME + 3600
}আপনার পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী ব্যবহার করে JWT স্বাক্ষর করুন, যা আপনি পরিষেবা অ্যাকাউন্ট কী তৈরি করার সময় ডাউনলোড করা JSON ফাইলে পাবেন।
উদাহরণস্বরূপ:
জাভা
java-jwt এবং Google এর auth লাইব্রেরি ব্যবহার করে:
public static String makeBearerToken() {
String token = null;
try {
// Get signing key and client email address.
FileInputStream is = new FileInputStream("your-service-account-credentials.json");
ServiceAccountCredentials credentials =
(ServiceAccountCredentials) GoogleCredentials.fromStream(is);
PrivateKey privateKey = credentials.getPrivateKey();
String keyId = credentials.getPrivateKeyId();
String clientEmail = credentials.getClientEmail();
// Token must expire in exactly one hour.
Date issuedAt = new Date();
Date expiresAt = new Date(issuedAt.getTime() + 3600000);
// Create signed token.
Algorithm rsaKey = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
token = JWT.create()
.withIssuer(clientEmail)
.withSubject(clientEmail)
.withAudience("https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService")
.withIssuedAt(issuedAt)
.withExpiresAt(expiresAt)
.withKeyId(keyId)
.sign(rsaKey);
} catch (ClassCastException e) {
// Credentials file doesn't contain a service account key.
} catch (IOException e) {
// Credentials file couldn't be loaded.
}
return token;
}
পাইথন
import json
import time
import jwt # pip install pyjwt
def make_bearer_token(credentials_file):
with open(credentials_file) as service_json:
service_account = json.load(service_json)
issuer = service_account['client_email']
subject = service_account['client_email']
private_key_id = service_account['private_key_id']
private_key = service_account['private_key']
issued_at = int(time.time())
expires_at = issued_at + 3600
payload = {'iss': issuer,
'sub': subject,
'aud': 'https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService',
'iat': issued_at,
'exp': expires_at}
encoded = jwt.encode(payload, private_key, algorithm='RS256',
headers={'kid': private_key_id})
return encoded
auth_token = make_bearer_token('your-service-account-credentials.json')
এই অনুমোদন টোকেনটি এক ঘন্টার জন্য RISC API কল করার জন্য ব্যবহার করা যেতে পারে। টোকেনের মেয়াদ শেষ হয়ে গেলে, RISC API কল করা চালিয়ে যাওয়ার জন্য একটি নতুন টোকেন তৈরি করুন।
২. RISC স্ট্রিম কনফিগারেশন API-তে কল করুন
এখন যেহেতু আপনার কাছে একটি অনুমোদন টোকেন আছে, আপনি আপনার প্রকল্পের নিরাপত্তা ইভেন্ট স্ট্রিম কনফিগার করতে RISC API ব্যবহার করতে পারেন, যার মধ্যে আপনার রিসিভার এন্ডপয়েন্ট নিবন্ধন করাও অন্তর্ভুক্ত।
এটি করার জন্য, https://risc.googleapis.com/v1beta/stream:update ঠিকানায় একটি HTTPS POST অনুরোধ করুন, যেখানে আপনার রিসিভারের শেষ বিন্দু এবং আপনার আগ্রহের ধরণের নিরাপত্তা ইভেন্ট উল্লেখ করুন:
POST /v1beta/stream:update HTTP/1.1
Host: risc.googleapis.com
Authorization: Bearer AUTH_TOKEN
{
"delivery": {
"delivery_method":
"https://schemas.openid.net/secevent/risc/delivery-method/push",
"url": RECEIVER_ENDPOINT
},
"events_requested": [
SECURITY_EVENT_TYPES
]
}
উদাহরণস্বরূপ:
জাভা
public static void configureEventStream(final String receiverEndpoint,
final List<String> eventsRequested,
String authToken) throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
String streamConfig = jsonMapper.writeValueAsString(new Object() {
public Object delivery = new Object() {
public String delivery_method =
"https://schemas.openid.net/secevent/risc/delivery-method/push";
public String url = receiverEndpoint;
};
public List<String> events_requested = eventsRequested;
});
HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:update");
updateRequest.addHeader("Content-Type", "application/json");
updateRequest.addHeader("Authorization", "Bearer " + authToken);
updateRequest.setEntity(new StringEntity(streamConfig));
HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
StatusLine responseStatus = updateResponse.getStatusLine();
int statusCode = responseStatus.getStatusCode();
HttpEntity entity = updateResponse.getEntity();
// Now handle response
}
// ...
configureEventStream(
"https://your-service.example.com/security-event-receiver",
Arrays.asList(
"https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required",
"https://schemas.openid.net/secevent/risc/event-type/account-disabled"),
authToken);
পাইথন
import requests
def configure_event_stream(auth_token, receiver_endpoint, events_requested):
stream_update_endpoint = 'https://risc.googleapis.com/v1beta/stream:update'
headers = {'Authorization': 'Bearer {}'.format(auth_token)}
stream_cfg = {'delivery': {'delivery_method': 'https://schemas.openid.net/secevent/risc/delivery-method/push',
'url': receiver_endpoint},
'events_requested': events_requested}
response = requests.post(stream_update_endpoint, json=stream_cfg, headers=headers)
response.raise_for_status() # Raise exception for unsuccessful requests
configure_event_stream(auth_token, 'https://your-service.example.com/security-event-receiver',
['https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required',
'https://schemas.openid.net/secevent/risc/event-type/account-disabled'])
যদি অনুরোধটি HTTP 200 ফেরত দেয়, তাহলে ইভেন্ট স্ট্রিমটি সফলভাবে কনফিগার করা হয়েছে এবং আপনার রিসিভার এন্ডপয়েন্টটি নিরাপত্তা ইভেন্ট টোকেন গ্রহণ শুরু করবে। পরবর্তী বিভাগে বর্ণনা করা হয়েছে যে কীভাবে আপনি আপনার স্ট্রিম কনফিগারেশন এবং এন্ডপয়েন্ট পরীক্ষা করে সবকিছু সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে পারেন।
আপনার বর্তমান স্ট্রিম কনফিগারেশন পান এবং আপডেট করুন
ভবিষ্যতে যদি আপনি কখনও আপনার স্ট্রিম কনফিগারেশন পরিবর্তন করতে চান, তাহলে বর্তমান স্ট্রিম কনফিগারেশন পেতে https://risc.googleapis.com/v1beta/stream এ একটি অনুমোদিত GET অনুরোধ করে, প্রতিক্রিয়ার মূল অংশ পরিবর্তন করে, এবং তারপর উপরে বর্ণিত হিসাবে পরিবর্তিত কনফিগারেশনটি https://risc.googleapis.com/v1beta/stream:update এ পোস্ট করে তা করতে পারেন।
ইভেন্ট স্ট্রিম বন্ধ করুন এবং পুনরায় শুরু করুন
যদি কখনও গুগল থেকে ইভেন্ট স্ট্রিম বন্ধ করার প্রয়োজন হয়, তাহলে https://risc.googleapis.com/v1beta/stream/status:update ঠিকানায় একটি অনুমোদিত POST অনুরোধ করুন যেখানে অনুরোধের বডিতে { "status": "disabled" } রাখুন। স্ট্রিমটি নিষ্ক্রিয় থাকাকালীন, গুগল আপনার এন্ডপয়েন্টে ইভেন্ট পাঠায় না এবং যখন সেগুলি ঘটে তখন নিরাপত্তা ইভেন্টগুলিকে বাফার করে না। ইভেন্ট স্ট্রিমটি পুনরায় সক্ষম করতে, একই এন্ডপয়েন্টে { "status": "enabled" } POST করুন।
৩. ঐচ্ছিক: আপনার স্ট্রিম কনফিগারেশন পরীক্ষা করুন
আপনার ইভেন্ট স্ট্রিমের মাধ্যমে একটি যাচাইকরণ টোকেন পাঠিয়ে আপনি যাচাই করতে পারেন যে আপনার স্ট্রিম কনফিগারেশন এবং রিসিভার এন্ডপয়েন্ট সঠিকভাবে একসাথে কাজ করছে। এই টোকেনে একটি অনন্য স্ট্রিং থাকতে পারে যা ব্যবহার করে আপনি যাচাই করতে পারেন যে টোকেনটি আপনার এন্ডপয়েন্টে গৃহীত হয়েছে। এই ফ্লো ব্যবহার করতে, আপনার রিসিভার নিবন্ধন করার সময় https://schemas.openid.net/secevent/risc/event-type/verification ইভেন্ট টাইপ সাবস্ক্রাইব করতে ভুলবেন না।
যাচাইকরণ টোকেনের অনুরোধ করতে, https://risc.googleapis.com/v1beta/stream:verify ঠিকানায় একটি অনুমোদিত HTTPS POST অনুরোধ করুন। অনুরোধের মূল অংশে, কিছু সনাক্তকারী স্ট্রিং উল্লেখ করুন:
{
"state": "ANYTHING"
}
উদাহরণস্বরূপ:
জাভা
public static void testEventStream(final String stateString,
String authToken) throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(new Object() {
public String state = stateString;
});
HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:verify");
updateRequest.addHeader("Content-Type", "application/json");
updateRequest.addHeader("Authorization", "Bearer " + authToken);
updateRequest.setEntity(new StringEntity(json));
HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
StatusLine responseStatus = updateResponse.getStatusLine();
int statusCode = responseStatus.getStatusCode();
HttpEntity entity = updateResponse.getEntity();
// Now handle response
}
// ...
testEventStream("Test token requested at " + new Date().toString(), authToken);
পাইথন
import requests
import time
def test_event_stream(auth_token, nonce):
stream_verify_endpoint = 'https://risc.googleapis.com/v1beta/stream:verify'
headers = {'Authorization': 'Bearer {}'.format(auth_token)}
state = {'state': nonce}
response = requests.post(stream_verify_endpoint, json=state, headers=headers)
response.raise_for_status() # Raise exception for unsuccessful requests
test_event_stream(auth_token, 'Test token requested at {}'.format(time.ctime()))
যদি অনুরোধটি সফল হয়, তাহলে যাচাইকরণ টোকেনটি আপনার নিবন্ধিত এন্ডপয়েন্টে পাঠানো হবে। উদাহরণস্বরূপ, যদি আপনার এন্ডপয়েন্ট কেবল লগ ইন করে যাচাইকরণ টোকেনগুলি পরিচালনা করে, তাহলে আপনি টোকেনটি প্রাপ্ত হয়েছে কিনা তা নিশ্চিত করার জন্য আপনার লগগুলি পরীক্ষা করতে পারেন।
ত্রুটি কোড রেফারেন্স
নিম্নলিখিত ত্রুটিগুলি RISC API দ্বারা ফেরত পাঠানো যেতে পারে:
| ত্রুটি কোড | ত্রুটি বার্তা | প্রস্তাবিত পদক্ষেপ |
|---|---|---|
| ৪০০ | স্ট্রিম কনফিগারেশনে $fieldname ক্ষেত্র থাকা আবশ্যক। | https://risc.googleapis.com/v1beta/stream:update এন্ডপয়েন্টে আপনার অনুরোধটি অবৈধ অথবা পার্স করা যাবে না। অনুগ্রহ করে আপনার অনুরোধে $fieldname অন্তর্ভুক্ত করুন। |
| ৪০১ | অননুমোদিত। | অনুমোদন ব্যর্থ হয়েছে। নিশ্চিত করুন যে আপনি অনুরোধের সাথে একটি অনুমোদন টোকেন সংযুক্ত করেছেন এবং টোকেনটি বৈধ এবং মেয়াদ শেষ হয়নি। |
| ৪০৩ | ডেলিভারি এন্ডপয়েন্টটি অবশ্যই একটি HTTPS URL হতে হবে। | আপনার ডেলিভারি এন্ডপয়েন্ট (অর্থাৎ, আপনি যে এন্ডপয়েন্টে RISC ইভেন্ট ডেলিভারি করার আশা করছেন) অবশ্যই HTTPS হতে হবে। আমরা HTTP URL-এ RISC ইভেন্ট পাঠাই না। |
| ৪০৩ | বিদ্যমান স্ট্রিম কনফিগারেশনে RISC-এর জন্য স্পেক-সম্মত ডেলিভারি পদ্ধতি নেই। | আপনার Google ক্লাউড প্রোজেক্টে ইতিমধ্যেই একটি RISC কনফিগারেশন থাকতে হবে। আপনি যদি Firebase ব্যবহার করেন এবং Google সাইন-ইন সক্ষম করে থাকেন, তাহলে Firebase আপনার প্রোজেক্টের জন্য RISC পরিচালনা করবে; আপনি কোনও কাস্টম কনফিগারেশন তৈরি করতে পারবেন না। আপনি যদি আপনার Firebase প্রোজেক্টের জন্য Google সাইন-ইন ব্যবহার না করেন, তাহলে অনুগ্রহ করে এটি বন্ধ করুন এবং এক ঘন্টা পরে আবার আপডেট করার চেষ্টা করুন। |
| ৪০৩ | প্রকল্পটি খুঁজে পাওয়া যায়নি। | সঠিক প্রকল্পের জন্য সঠিক পরিষেবা অ্যাকাউন্ট ব্যবহার করছেন কিনা তা নিশ্চিত করুন। আপনি হয়ত একটি মুছে ফেলা প্রকল্পের সাথে সম্পর্কিত একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করছেন। একটি প্রকল্পের সাথে সম্পর্কিত সমস্ত পরিষেবা অ্যাকাউন্ট কীভাবে দেখতে হয় তা শিখুন। |
| ৪০৩ | আপনার RISC কনফিগারেশন অ্যাক্সেস করার জন্য পরিষেবা অ্যাকাউন্টের অনুমতি প্রয়োজন | আপনার প্রকল্পে যান API Console এবং এই নির্দেশাবলী অনুসরণ করে আপনার প্রকল্পে কল করা পরিষেবা অ্যাকাউন্টে "RISC কনফিগারেশন অ্যাডমিন" ভূমিকা ( roles/riscconfigs.admin ) বরাদ্দ করুন। |
| ৪০৩ | স্ট্রিম ম্যানেজমেন্ট API গুলি শুধুমাত্র একটি পরিষেবা অ্যাকাউন্টের মাধ্যমে কল করা উচিত। | পরিষেবা অ্যাকাউন্ট ব্যবহার করে আপনি কীভাবে Google API গুলিকে কল করতে পারেন সে সম্পর্কে আরও তথ্য এখানে দেওয়া হল। |
| ৪০৩ | ডেলিভারি এন্ডপয়েন্টটি আপনার প্রকল্পের কোনও ডোমেনের অন্তর্গত নয়। | প্রতিটি প্রকল্পের অনুমোদিত ডোমেনের একটি সেট থাকে। যদি আপনার ডেলিভারি এন্ডপয়েন্ট (অর্থাৎ যে এন্ডপয়েন্টে আপনি RISC ইভেন্টগুলি ডেলিভারি করার আশা করেন) তাদের মধ্যে একটিতে হোস্ট করা না থাকে, তাহলে আমাদের প্রয়োজন যে আপনি সেই সেটে এন্ডপয়েন্টের ডোমেন যোগ করুন। |
| ৪০৩ | এই API ব্যবহার করার জন্য আপনার প্রকল্পে কমপক্ষে একটি OAuth ক্লায়েন্ট কনফিগার করা থাকতে হবে। | RISC শুধুমাত্র তখনই কাজ করে যখন আপনি এমন একটি অ্যাপ তৈরি করেন যা Google সাইন ইন সমর্থন করে। এই সংযোগের জন্য একটি OAuth ক্লায়েন্ট প্রয়োজন। যদি আপনার প্রকল্পে কোনও OAuth ক্লায়েন্ট না থাকে, তাহলে সম্ভবত RISC আপনার জন্য কার্যকর হবে না। আমাদের API-এর জন্য Google-এর OAuth ব্যবহার সম্পর্কে আরও জানুন। |
| ৪০৩ | অসমর্থিত অবস্থা। অবৈধ অবস্থা। | আমরা এই মুহূর্তে শুধুমাত্র " enabled " এবং " disabled " স্ট্রিম স্ট্যাটাস সমর্থন করি। |
| ৪০৪ | প্রকল্পের কোনও RISC কনফিগারেশন নেই। প্রকল্পের কোনও RISC কনফিগারেশন নেই, স্থিতি আপডেট করা যাচ্ছে না। | একটি নতুন স্ট্রিম কনফিগারেশন তৈরি করতে https://risc.googleapis.com/v1beta/stream:update এন্ডপয়েন্টে কল করুন। |
| ৪XX/৫XX | স্ট্যাটাস আপডেট করা যায়নি। | আরও তথ্যের জন্য বিস্তারিত ত্রুটি বার্তাটি দেখুন। |
টোকেন স্কোপ অ্যাক্সেস করুন
আপনি যদি RISC API-তে প্রমাণীকরণের জন্য অ্যাক্সেস টোকেন ব্যবহার করার সিদ্ধান্ত নেন, তাহলে আপনার অ্যাপ্লিকেশনটি যে স্কোপগুলির জন্য অনুরোধ করবে তা হল:
| শেষবিন্দু | ব্যাপ্তি |
|---|---|
https://risc.googleapis.com/v1beta/stream/status | https://www.googleapis.com/auth/risc.status.readonly অথবা https://www.googleapis.com/auth/risc.status.readwrite |
https://risc.googleapis.com/v1beta/stream/status:update | https://www.googleapis.com/auth/risc.status.readwrite |
https://risc.googleapis.com/v1beta/stream | https://www.googleapis.com/auth/risc.configuration.readonly অথবা https://www.googleapis.com/auth/risc.configuration.readwrite |
https://risc.googleapis.com/v1beta/stream:update | https://www.googleapis.com/auth/risc.configuration.readwrite |
https://risc.googleapis.com/v1beta/stream:verify | https://www.googleapis.com/auth/risc.verify |
সাহায্য দরকার?
প্রথমে, আমাদের ত্রুটি কোড রেফারেন্স বিভাগটি দেখুন। যদি আপনার এখনও প্রশ্ন থাকে, তাহলে #SecEvents ট্যাগ সহ স্ট্যাক ওভারফ্লোতে পোস্ট করুন।