আপনার অ্যাপ ব্যবহারকারীদের Google ব্যবহার করে তাদের অ্যাকাউন্টে সাইন-ইন করার অনুমতি দিলে, আপনি ক্রস-অ্যাকাউন্ট সুরক্ষা পরিষেবার মাধ্যমে প্রদান করা নিরাপত্তা সংক্রান্ত ইভেন্টের বিজ্ঞপ্তি শুনে এবং তার উত্তর দিয়ে এইসব শেয়ার করা ব্যবহারকারীর অ্যাকাউন্টের নিরাপত্তা উন্নত করতে পারবেন।
এইসব বিজ্ঞপ্তি আপনার ব্যবহারকারীদের Google অ্যাকাউন্টে হওয়া বড় পরিবর্তন সম্পর্কে আপনাকে সতর্ক করে, যা প্রায়শই আপনার অ্যাপে তাদের অ্যাকাউন্টের নিরাপত্তার উপর প্রভাব ফেলতে পারে। যেমন, কোনও ব্যবহারকারীর Google অ্যাকাউন্ট হাইজ্যাক করা হলে, ইমেল অ্যাকাউন্ট ফিরিয়ে আনা বা সিঙ্গল সাইন-অন ব্যবহার করার মাধ্যমে আপনার অ্যাপে ব্যবহারকারীর অ্যাকাউন্ট সম্ভাব্যভাবে আপোস করতে পারে।
এই ধরনের ইভেন্টের ঝুঁকি কমাতে, Google আপনার পরিষেবা অবজেক্ট পাঠায়, যাকে নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন বলা হয়। এই টোকেনগুলি খুব কম তথ্য প্রকাশ করে—শুধু নিরাপত্তা সংক্রান্ত ঘটনার ধরন এবং কখন এটি ঘটেছে এবং প্রভাবিত ব্যবহারকারীর শনাক্তকারী—তবে আপনি এগুলি ব্যবহার করে উপযুক্ত পদক্ষেপ নিতে পারেন। যেমন, কোনও ব্যবহারকারীর Google অ্যাকাউন্ট হ্যাক হয়ে গেলে, আপনি সাময়িকভাবে সেই ব্যবহারকারীর জন্য'Google-এর মাধ্যমে সাইন-ইন করুন' ফিচার বন্ধ করে দিতে পারেন এবং ব্যবহারকারীর Gmail আইডিতে অ্যাকাউন্ট ফিরিয়ে আনার ইমেল পাঠানো বন্ধ করতে পারেন।
ক্রস-অ্যাকাউন্ট সুরক্ষা RISC স্ট্যান্ডার্ড-এর উপর ভিত্তি করে তৈরি করা হয়েছে, যা OpenID Foundation-এ ডেভেলপ করা হয়েছে।
এক নজরে
আপনার অ্যাপ বা পরিষেবার সাথে ক্রস-অ্যাকাউন্ট সুরক্ষা ব্যবহার করতে, আপনাকে অবশ্যই নিম্নলিখিত টাস্কগুলি সম্পূর্ণ করতে হবে:
API কনসোলে আপনার প্রোজেক্ট সেট-আপ করুন।
একটি ইভেন্ট রিসিভার এন্ডপয়েন্ট তৈরি করুন, যেখানে Google নিরাপত্তা ইভেন্ট টোকেন পাঠাবে। এই এন্ডপয়েন্ট, টোকেন পাওয়ার পরে তা যাচাই করে এবং আপনার বেছে নেওয়া পদ্ধতিতে নিরাপত্তা সংক্রান্ত ঘটনার উত্তর দেয়।
নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন পাওয়া শুরু করতে Google-এ আপনার এন্ডপয়েন্ট রেজিস্টার করুন।
পূর্বশর্ত
আপনি শুধুমাত্র সেইসব Google ব্যবহারকারীর জন্য নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন পাবেন যারা আপনার
পরিষেবাকে তাদের প্রোফাইল তথ্য বা ইমেল আইডি অ্যাক্সেস করার অনুমতি দিয়েছেন। আপনি
profile বা email স্কোপের জন্য অনুরোধ করে এই অনুমতি পান। নতুন
Google-এর মাধ্যমে সাইন-ইন করুন বা পুরনো
Google Sign-in SDK ডিফল্ট হিসেবে এইসব স্কোপের জন্য অনুরোধ করে, তবে
আপনি ডিফল্ট সেটিংস ব্যবহার না করলে অথবা সরাসরি Google-এর OpenID
Connect এন্ডপয়েন্ট অ্যাক্সেস করলে, নিশ্চিত করুন
যে আপনি এইসব স্কোপের মধ্যে অন্তত একটির জন্য অনুরোধ করছেন।
API কনসোলে একটি প্রোজেক্ট সেট-আপ করুন
নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন পাওয়া শুরু করার আগে, আপনাকে একটি পরিষেবা অ্যাকাউন্ট তৈরি করতে হবে এবং API কনসোল প্রোজেক্টে RISC API চালু করতে হবে। আপনার অ্যাপে Google সাইন-ইনের মতো Google পরিষেবা অ্যাক্সেস করার জন্য আপনি যে API Console প্রোজেক্ট ব্যবহার করেন, আপনাকে অবশ্যই সেটিই ব্যবহার করতে হবে।
পরিষেবা অ্যাকাউন্ট তৈরি করতে:
API Console ক্রেডেনশিয়াল পৃষ্ঠা খুলুন। প্রম্পট করা হলে, আপনার অ্যাপে Google পরিষেবা অ্যাক্সেস করার জন্য আপনি যে API Console প্রোজেক্ট ব্যবহার করেন সেটি বেছে নিন।
ক্রেডেনশিয়াল তৈরি করুন > পরিষেবা অ্যাকাউন্ট বিকল্পে ক্লিক করুন।
RISC কনফিগারেশন অ্যাডমিন ভূমিকা (
roles/riscconfigs.admin) সহ নতুন পরিষেবা অ্যাকাউন্ট তৈরি করুন এই নির্দেশাবলী অনুসরণ করে।(ঐচ্ছিক) আপনার Google Cloud প্রতিষ্ঠান যদি পরিষেবা অ্যাকাউন্ট কী তৈরি করার অনুমতি দেয় এবং আপনি স্থানীয়ভাবে JWT-তে সাইন করার পরিকল্পনা করেন, তাহলে আপনার নতুন তৈরি করা পরিষেবা অ্যাকাউন্টের জন্য একটি কী তৈরি করুন। JSON কী-এর ধরন বেছে নিন এবং তারপরে তৈরি করুন বিকল্পে ক্লিক করুন। কী তৈরি হয়ে গেলে, আপনি একটি JSON ফাইল ডাউনলোড করবেন যাতে আপনার পরিষেবা অ্যাকাউন্টের ক্রেডেনশিয়াল থাকবে। এই ফাইলটি কোনও নিরাপদ জায়গায় রাখুন, তবে এটি যেন আপনার ইভেন্ট রিসিভার এন্ডপয়েন্ট থেকে অ্যাক্সেস করা যায়।
আপনার প্রোজেক্টের ক্রেডেনশিয়াল পৃষ্ঠায় থাকাকালীন, 'Google-এর মাধ্যমে সাইন-ইন করুন' বা Google Sign-in (লিগ্যাসি)-এর জন্য আপনি যে ক্লায়েন্ট আইডি ব্যবহার করেন সেটিও নোট করে নিন। সাধারণত, আপনি যে প্ল্যাটফর্ম ব্যবহার করেন, সেটির জন্য আপনার কাছে একটি ক্লায়েন্ট আইডি থাকে। নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন যাচাই করার জন্য আপনার এই ক্লায়েন্ট আইডি প্রয়োজন হবে, যেমনটি পরবর্তী বিভাগে বর্ণনা করা হয়েছে।
RISC API চালু করতে:
API কনসোলে RISC API পৃষ্ঠা খুলুন। Google পরিষেবা অ্যাক্সেস করার জন্য আপনি যে প্রোজেক্ট ব্যবহার করেন সেটি এখনও বেছে নেওয়া আছে কিনা তা নিশ্চিত করুন।
RISC শর্তাবলী পড়ুন এবং প্রয়োজনীয়তা বুঝেছেন কিনা তা নিশ্চিত করুন।
আপনি যদি কোনও সংস্থার মালিকানাধীন প্রোজেক্টের জন্য API চালু করেন, তাহলে নিশ্চিত করুন যে আপনি RISC শর্তাবলীতে আপনার সংস্থাকে আবদ্ধ করার জন্য অনুমোদিত।
আপনি RISC শর্তাবলীতে সম্মতি দিলে তবেই চালু করুন বিকল্পে ক্লিক করুন।
ইভেন্ট রিসিভার এন্ডপয়েন্ট তৈরি করুন
Google থেকে নিরাপত্তা সংক্রান্ত ঘটনার বিজ্ঞপ্তি পেতে, আপনি একটি HTTPS এন্ডপয়েন্ট তৈরি করেন যা HTTPS POST অনুরোধগুলি পরিচালনা করে। আপনি এই এন্ডপয়েন্ট রেজিস্টার করার পরে (নিচে দেখুন), Google এন্ডপয়েন্টে নিরাপত্তা ইভেন্ট টোকেন নামে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত স্ট্রিং পোস্ট করা শুরু করবে। নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন হল সাইন-ইন করা JWT, যাতে নিরাপত্তা সংক্রান্ত একটি ইভেন্টের তথ্য থাকে।
আপনার এন্ডপয়েন্টে পাওয়া প্রতিটি নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেনের জন্য, প্রথমে টোকেনটি যাচাই ও ডিকোড করুন, তারপর আপনার পরিষেবার জন্য উপযুক্ত নিরাপত্তা সংক্রান্ত ইভেন্টটি ম্যানেজ করুন। প্রতারকদের ক্ষতিকর আক্রমণ থেকে রক্ষা পেতে ডিকোড করার আগে ইভেন্ট টোকেন যাচাই করা অপরিহার্য। নিম্নলিখিত বিভাগগুলি এইসব টাস্কের বর্ণনা দেয়:
১. নিরাপত্তা ইভেন্ট টোকেন ডিকোড ও যাচাই করা
নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন হল এক ধরনের JWT, তাই আপনি যেকোনও JWT লাইব্রেরি ব্যবহার করতে পারেন, যেমন jwt.io-তে তালিকাভুক্ত একটি, ডিকোড এবং যাচাই করার জন্য। আপনি যে লাইব্রেরিই ব্যবহার করুন না কেন, আপনার টোকেন যাচাইকরণ কোডকে অবশ্যই নিম্নলিখিত কাজগুলি করতে হবে:
- Google-এর RISC কনফিগারেশন ডকুমেন্ট থেকে ক্রস-অ্যাকাউন্ট সুরক্ষা ইস্যুকারী শনাক্তকারী (
issuer) এবং সাইনিং কী সার্টিফিকেট URI (jwks_uri) পান, যা আপনিhttps://accounts.google.com/.well-known/risc-configuration-এ খুঁজে পাবেন। - আপনার পছন্দের JWT লাইব্রেরি ব্যবহার করে, নিরাপত্তা ইভেন্ট টোকেনের হেডার থেকে সাইন-ইন কী আইডি পান।
- Google-এর সাইনিং কী সার্টিফিকেট ডকুমেন্ট থেকে, আগের ধাপে পাওয়া কী আইডির সাথে পাবলিক কী পান। আপনি যে আইডি খুঁজছেন, ডকুমেন্টে সেই আইডি সহ কোনও'কী' না থাকলে, সম্ভবত নিরাপত্তা সংক্রান্ত ঘটনার টোকেনটি ভুল এবং আপনার এন্ডপয়েন্ট HTTP error 400 রিটার্ন করবে।
- আপনার পছন্দের JWT লাইব্রেরি ব্যবহার করে, নিম্নলিখিতগুলি যাচাই করুন:
- নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেনটি আগের ধাপে পাওয়া সর্বজনীন কী ব্যবহার করে স্বাক্ষরিত হয়।
- টোকেনের
audদাবি হল আপনার অ্যাপের ক্লায়েন্ট আইডির মধ্যে একটি। - টোকেনের
issদাবি, RISC ডিসকভারি ডকুমেন্ট থেকে পাওয়া ইস্যুকারী শনাক্তকারীর সাথে মিলে যায়। মনে রাখবেন, টোকেনের মেয়াদ শেষ হওয়ার তারিখ (exp) আপনাকে যাচাই করতে হবে না, কারণ নিরাপত্তা সংক্রান্ত ইভেন্ট টোকেন ঐতিহাসিক ইভেন্টকে দেখায় এবং সেই কারণে এর মেয়াদ শেষ হয় না।
যেমন:
Java
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;
}
Python
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 অ্যাকাউন্ট আইডি হল সেই একই শনাক্তকারী (sub) যা নতুন 'Google-এর মাধ্যমে সাইন-ইন করুন' (Javascript
, HTML) লাইব্রেরি, পুরনো Google সাইন-ইন লাইব্রেরি বা
OpenID Connect-এর মাধ্যমে ইস্যু করা JWT আইডি টোকেনে থাকে। দাবির subject_type id_token_claims হলে,
এতে ব্যবহারকারীর ইমেল আইডি সহ email ফিল্ডও থাকতে পারে।
নির্দিষ্ট ব্যবহারকারীর অ্যাকাউন্টে ইভেন্টের ধরন অনুযায়ী যথাযথ অ্যাকশন নিতে events দাবিতে উল্লেখ করা তথ্য ব্যবহার করুন।
OAuth টোকেন শনাক্তকারী
ব্যক্তিগত টোকেন সম্পর্কিত OAuth ইভেন্টের জন্য, টোকেন সাবজেক্ট শনাক্তকারীর ধরন নিম্নলিখিত ফিল্ডগুলি অন্তর্ভুক্ত করে:
token_type: শুধুমাত্রrefresh_tokenকাজ করে।token_identifier_alg: সম্ভাব্য ভ্যালু দেখতে নিচের টেবিল দেখুন।token: নিচের টেবিল দেখুন।
| token_identifier_alg | টোকেন |
|---|---|
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 Sign-in-এর জন্য হলে, বর্তমানে খোলা সেশন বন্ধ করুন। এছাড়াও, আপনি ব্যবহারকারীকে বিকল্প সাইন-ইন পদ্ধতি সেট-আপ করার পরামর্শ দিতে পারেন। সাজেশন: টোকেনটি যদি অন্য 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 |
প্রয়োজনীয়: অ্যাকাউন্ট বন্ধ করার কারণ যদি
সাজেশন: অ্যাকাউন্ট বন্ধ করার কারণ যদি
সাজেস্ট করা হয়েছে: কোনও কারণ উল্লেখ করা না থাকলে, ব্যবহারকারীর জন্য Google Sign-in বন্ধ করুন এবং ব্যবহারকারীর Google অ্যাকাউন্টের সাথে যুক্ত ইমেল আইডি (সাধারণত, তবে বাধ্যতামূলক নয়, Gmail অ্যাকাউন্ট) ব্যবহার করে অ্যাকাউন্ট ফিরিয়ে আনার সুবিধা বন্ধ করুন। ব্যবহারকারীকে অন্য কোনও সাইন-ইন পদ্ধতি অফার করুন। |
https://schemas.openid.net/secevent/risc/event-type/account-enabled |
সাজেস্ট করা হয়েছে: ব্যবহারকারীর জন্য Google Sign-in আবার চালু করুন এবং ব্যবহারকারীর Google অ্যাকাউন্ট ইমেল আইডির মাধ্যমে অ্যাকাউন্ট ফিরিয়ে আনার সুবিধা আবার চালু করুন। | |
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required |
সাজেস্ট করা হয়েছে: আপনার পরিষেবায় সন্দেহজনক অ্যাক্টিভিটি লক্ষ্য করুন এবং উপযুক্ত অ্যাকশন নিন। | |
https://schemas.openid.net/secevent/risc/event-type/verification |
state=state | সাজেস্ট করা হয়েছে: টেস্ট টোকেন পাওয়া গেছে বলে লগ করুন। |
ডুপ্লিকেট ও মিস হয়ে যাওয়া ইভেন্ট
'ক্রস-অ্যাকাউন্ট সুরক্ষা' ফিচার সেইসব ইভেন্ট আবার ডেলিভার করার চেষ্টা করবে যেগুলি ডেলিভার করা হয়নি বলে
এটি মনে করে। তাই, আপনি কখনও কখনও একই ইভেন্ট
একাধিকবার পেতে পারেন। এর ফলে যদি বারবার একই অ্যাকশন হয় এবং আপনার ব্যবহারকারীদের অসুবিধা হয়, তাহলে ইভেন্ট ডি-ডুপ করার জন্য jti ক্লেম (যা কোনও ইভেন্টের জন্য অনন্য শনাক্তকারী) ব্যবহার করার কথা বিবেচনা করুন। Google Cloud
Dataflow-এর মতো এক্সটার্নাল টুল আছে যা আপনাকে
ডুপ্লিকেট ডেটাফ্লো এক্সিকিউট করতে সাহায্য করতে পারে।
মনে রাখবেন যে ইভেন্টগুলি সীমিত সংখ্যক বার চেষ্টা করার মাধ্যমে ডেলিভার করা হয়, তাই আপনার রিসিভার যদি দীর্ঘ সময়ের জন্য বন্ধ থাকে, তাহলে আপনি কিছু ইভেন্ট স্থায়ীভাবে মিস করতে পারেন।
আপনার রিসিভার রেজিস্টার করুন
নিরাপত্তা সংক্রান্ত ঘটনা সম্পর্কে বিজ্ঞপ্তি পাওয়া শুরু করতে, RISC API ব্যবহার করে আপনার রিসিভার এন্ডপয়েন্ট রেজিস্টার করুন। RISC API-তে কল করার সময় অবশ্যই একটি অনুমোদন টোকেন থাকতে হবে।
আপনি শুধুমাত্র আপনার অ্যাপের ব্যবহারকারীদের জন্য নিরাপত্তা সংক্রান্ত ঘটনা পাবেন, তাই নিচে বর্ণিত ধাপগুলির জন্য পূর্বশর্ত হিসেবে আপনার GCP প্রোজেক্টে একটি OAuth সম্মতি স্ক্রিন কনফিগার করতে হবে।
১. একটি অনুমোদনের টোকেন জেনারেট করুন
আপনি RISC API-এর জন্য অথরাইজেশন টোকেন জেনারেট করতে পারেন, হয়
Google Cloud CLI (gcloud)-এর সাথে পরিষেবা
অ্যাকাউন্ট ইমপার্সোনেশন (iam.disableServiceAccountKeyCreation
এনফোর্স করা হলে বা এককালীন CLI সেট-আপের জন্য সাজেস্ট করা হয়) ব্যবহার করে অথবা পরিষেবা
অ্যাকাউন্টের ব্যক্তিগত কী দিয়ে স্থানীয়ভাবে JWT সাইন করে।
বিকল্প ক: gcloud ব্যবহার করে স্বল্পমেয়াদী অ্যাক্সেস টোকেন জেনারেট করুন (কোনও JSON কী প্রয়োজন নেই)
আপনার ব্যবহারকারী অ্যাকাউন্টে পরিষেবা অ্যাকাউন্টের জন্য 'পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর' ভূমিকা
(roles/iam.serviceAccountTokenCreator) থাকলে, আপনি সরাসরি নিজের টার্মিনাল থেকে প্রয়োজনীয় RISC কনফিগারেশন স্কোপ সহ
স্বল্পমেয়াদী OAuth 2.0 অ্যাক্সেস টোকেন তৈরি করতে পারবেন:
AUTH_TOKEN=$(gcloud auth print-access-token \
--impersonate-service-account=SERVICE_ACCOUNT_EMAIL \
--scopes=https://www.googleapis.com/auth/risc.configuration.readwrite,https://www.googleapis.com/auth/risc.verify,https://www.googleapis.com/auth/risc.status.readwrite)
RISC API-এর জন্য উপলভ্য OAuth 2.0 স্কোপ সম্পর্কে আরও জানতে অ্যাক্সেস টোকেন স্কোপ দেখুন।
বিকল্প খ: পরিষেবা অ্যাকাউন্ট কী ব্যবহার করে সেল্ফ-সাইন করা JWT তৈরি করা
অন্যথায়, নেটওয়ার্ক রাউন্ড ট্রিপ ছাড়াই স্থানীয়ভাবে অথরাইজেশন টোকেন জেনারেট করতে, নিম্নলিখিত দাবি সহ 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
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;
}
Python
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
]
}
যেমন:
Java
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);
Python
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-এ পোস্ট করে তা করতে পারেন।
ইভেন্ট স্ট্রিম বন্ধ ও আবার চালু করা
Google থেকে ইভেন্ট স্ট্রিম বন্ধ করার প্রয়োজন হলে, অনুরোধের বডিতে { "status": "disabled" }
সহ https://risc.googleapis.com/v1beta/stream/status:update-এ অনুমোদিত POST
অনুরোধ করুন। স্ট্রিম বন্ধ থাকাকালীন, Google আপনার এন্ডপয়েন্টে ইভেন্ট পাঠায় না
এবং নিরাপত্তা সংক্রান্ত ঘটনা ঘটলে তা বাফার করে না। ইভেন্ট স্ট্রিম আবার চালু করতে, একই এন্ডপয়েন্টে { "status": "enabled" } POST করুন।
৩. ঐচ্ছিক: আপনার স্ট্রিম কনফিগারেশন পরীক্ষা করা
আপনার ইভেন্ট স্ট্রিমের মাধ্যমে একটি যাচাইকরণ টোকেন পাঠিয়ে, আপনার স্ট্রিম কনফিগারেশন এবং রিসিভার এন্ডপয়েন্ট একসাথে সঠিকভাবে কাজ করছে কিনা তা যাচাই করতে পারেন। এই টোকেনে একটি অনন্য স্ট্রিং থাকতে পারে যা আপনি ব্যবহার করতে পারেন টোকেনটি আপনার এন্ডপয়েন্টে গৃহীত হয়েছে কিনা তা যাচাই করতে। এই ফ্লো ব্যবহার করতে, আপনার রিসিভার রেজিস্টার করার সময় https://schemas.openid.net/secevent/risc/event-type/verification ইভেন্টের ধরন সাবস্ক্রাইব করতে ভুলবেন না।
যাচাইকরণ টোকেনের অনুরোধ করতে,
https://risc.googleapis.com/v1beta/stream:verify-এ অনুমোদিত HTTPS POST অনুরোধ করুন। অনুরোধের মূল অংশে, কিছু শনাক্তকরণ স্ট্রিং
নির্দিষ্ট করুন:
{
"state": "ANYTHING"
}
যেমন:
Java
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);
Python
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 Cloud প্রোজেক্টে আগে থেকেই RISC কনফিগারেশন থাকতে হবে। আপনি Firebase ব্যবহার করলে এবং Google সাইন-ইন চালু থাকলে, Firebase আপনার প্রোজেক্টের জন্য RISC ম্যানেজ করবে; আপনি কাস্টম কনফিগারেশন তৈরি করতে পারবেন না। আপনার Firebase প্রোজেক্টের জন্য Google Sign-In ব্যবহার না করলে, এটি বন্ধ করে দিন এবং এক ঘণ্টা পরে আবার আপডেট করার চেষ্টা করুন। |
| ৪০৩ | প্রোজেক্ট খুঁজে পাওয়া যায়নি। | সঠিক প্রোজেক্টের জন্য সঠিক পরিষেবা অ্যাকাউন্ট ব্যবহার করছেন কিনা তা ভাল করে দেখে নিন। আপনি হয়ত মুছে দেওয়া প্রোজেক্টের সাথে যুক্ত কোনও পরিষেবা অ্যাকাউন্ট ব্যবহার করছেন। জানুন কীভাবে কোনও প্রোজেক্টের সাথে যুক্ত সব পরিষেবা অ্যাকাউন্ট দেখতে হয়। |
| ৪০৩ | আপনার RISC কনফিগারেশন অ্যাক্সেস করার জন্য পরিষেবা অ্যাকাউন্টের অনুমতি প্রয়োজন | আপনার প্রোজেক্টের API কনসোলে যান এবং
"RISC কনফিগারেশন অ্যাডমিন" ভূমিকা
(roles/riscconfigs.admin)
সেই পরিষেবা অ্যাকাউন্টকে অ্যাসাইন করুন যেটি আপনার প্রোজেক্টে কল করছে।
এইসব নির্দেশাবলী
অনুসরণ করে এটি করুন।
|
| ৪০৩ | স্ট্রিম ম্যানেজমেন্ট API শুধুমাত্র একটি পরিষেবা অ্যাকাউন্ট দ্বারা কল করা উচিত। | পরিষেবা অ্যাকাউন্টের মাধ্যমে আপনি কীভাবে Google API কল করতে পারবেন সেই সম্পর্কে এখানে আরও তথ্য দেওয়া হল। |
| ৪০৩ | ডেলিভারি এন্ডপয়েন্ট আপনার কোনও প্রোজেক্টের ডোমেনের সাথে সম্পর্কিত নয়। | প্রতিটি প্রোজেক্টে এক সেট অনুমোদিত ডোমেন থাকে। আপনার ডেলিভারি এন্ডপয়েন্ট (অর্থাৎ, যে এন্ডপয়েন্টে আপনি RISC ইভেন্ট ডেলিভার হবে বলে আশা করেন) যদি এগুলির মধ্যে কোনও একটিতে হোস্ট করা না থাকে, তাহলে আপনাকে সেই সেটে এন্ডপয়েন্টের ডোমেন যোগ করতে হবে। |
| ৪০৩ | এই API ব্যবহার করতে হলে আপনার প্রোজেক্টে অন্তত একটি OAuth ক্লায়েন্ট কনফিগার করা থাকতে হবে। | RISC তখনই কাজ করে যখন আপনি এমন অ্যাপ তৈরি করেন যা Google Sign In-কে সাপোর্ট করে। এই কানেকশনের জন্য OAuth ক্লায়েন্ট প্রয়োজন। আপনার প্রোজেক্টে কোনও OAuth ক্লায়েন্ট না থাকলে, RISC আপনার জন্য উপযোগী নাও হতে পারে। আমাদের API-এর জন্য Google-এর OAuth ব্যবহার করা সম্পর্কে আরও জানুন। |
| ৪০৩ |
কাজ করে না এমন স্ট্যাটাস। অবৈধ স্থিতি৷ |
আমরা বর্তমানে শুধু “enabled” এবং
“disabled” স্ট্রিম স্ট্যাটাস সাপোর্ট করি। |
| ৪০৪ |
প্রোজেক্টে কোনও RISC কনফিগারেশন নেই। প্রোজেক্টে কোনও RISC কনফিগারেশন নেই, স্ট্যাটাস আপডেট করা যাবে না। |
নতুন স্ট্রিম কনফিগারেশন তৈরি করতে https://risc.googleapis.com/v1beta/stream:update এন্ডপয়েন্ট কল করুন। |
| 4XX/5XX | স্ট্যাটাস আপডেট করা যায়নি। | আরও তথ্যের জন্য বিস্তারিত ত্রুটি মেসেজ দেখুন। |
অ্যাক্সেস টোকেনের স্কোপ
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 |
সাহায্য চান?
প্রথমে, আমাদের ত্রুটি কোড রেফারেন্স বিভাগটি দেখুন। আপনার এখনও কোনও প্রশ্ন থাকলে, Stack Overflow-তে #SecEvents ট্যাগ সহ পোস্ট করুন।