ওয়েব অ্যাপ্লিকেশনের নিরাপদ তথ্য আদান-প্রদানের ক্ষেত্রে https এর গুরুত্ব

ওয়েব অ্যাপ্লিকেশনের নিরাপদ তথ্য আদান-প্রদানের ক্ষেত্রে https এর গুরুত্ব

HTTPS with SSL/TLS: Ensuring Secure and Encrypted Connections for Web Applications

আমরা যখন ওয়েব ব্রাউজার দিয়ে কোনো ওয়েবসাইট ভিজিট করি, তখন আমাদের ব্রাউজার এবং ওয়েবসাইটের মধ্যে রিকোয়েস্ট রেসপন্স আদান প্রদান হয়। এই রিকোয়েস্ট রেসপন্স আদান প্রদান করার জন্য একটা প্রটোকল (যোগাযোগের মাধ্যম) ব্যবহার করা হয়। সাধারণরত এটি http হয়ে থাকে। এছাড়াও আরও প্রটোকল আছে যেমন - FTP, SMTP ইত্যাদি।

HTTP

আমরা জানি যে, HTTP ক্লাইন্ট এবং সার্ভার এর মধ্যে ডেটা আদান-প্রদান করার জন্য ব্যবহিত হয়ে থাকে যোগাযোগের মাধ্যম হিসাবে। কিন্তু এই HTTP প্রটোকল নিরাপদ না। এর মাধ্যমে যদি বিভিন্ন সংবেদনশীল তথ্য আদান প্রদান করা হয়, আর যদি অন্য কারো কাছে এই নেটওয়ার্কের অ্যাক্সেস থাকে তাহলে সে আমাদের তথ্য মডিফাই বা ইন্টারসেপ্ট করতে পারবে। এটি বিভিন্ন ভাবে হতে পারে যেমন -

  • স্নিফিং (Sniffing)ঃ এই ক্ষেত্রে ক্লাইন্ট এবং সার্ভার নেটওয়ার্ক ট্র্যাফিকের ভেতর যে packets (ডেটার ক্ষুদ্রতম অংশ) আদান প্রদান করে সেগুলোকে বিভিন্ন ধরনের টুলস যেমন - Wireshark, tcpdump ইত্যাদি ব্যবহার করার মাধ্যমে headers, body এবং cookies থেকে ডেটা বের করে নিয়ে আসা যায়।

  • স্পোফিং (Spoofing)ঃ বিভিন্ন ধরনের টোলস যেমন - DNS poisoning, ARP spoofing ইত্যাদি ব্যবহার করার মাধ্যমে ক্লাইন্ট রিকোয়েস্টকে যে কোন ম্যালিসাস সার্ভারে রিডাইরেক্ট করানো যায়। এর মাধ্যমে ক্লাইন্ট সাইডে ফেক অথবা মডিফাইড http ডেটা যেমন - ফিশিং পেজ, ভাইরাস ইত্যাদি পাঠানো যায়।

  • ইনজেকশন (Injection)ঃ Burp Suite, ZAP এই ধরনের বিভিন্ন টুলস ব্যবহার করার মাধ্যমে http ডেটার মধ্যে বিভিন্ন ধরনের ম্যালিসাস কোড অথবা কমান্ড ইনজেক্ট করে যায়। এর মাধ্যমে সার্ভার সাইড অ্যাপ্লিকেশনের বিভিন্ন দুর্বলতাকে কাজে লাগিয়ে এর ক্ষতি সাধন করা যায়। উল্লেখযোগ্য কয়েকটা পদ্ধতি হল - SQL injection, cress-site scripting (XSS), remote code execution (RCE) ইত্যাদি।

HTTPS

HTTP এর একটা সিকিউর ভার্সন হল HTTPS (Hypertext transfer protocol secure)। HTTPS ব্যবহারের মাধ্যমে ইন্টারনেটে ডেটা আদান প্রদান করার সময় ইনক্রিপ্টেড অবস্থায় থাকে। কিন্তু এই ইনক্রিপশন প্রক্রিয়া কিভাবে হয়?

HTTPS মূলত SSL/TLS এর ইনক্রিপশন ব্যবহার করে। SSL এবং TLS উভয়ই একই উদ্দেশ্যে ব্যবহৃত প্রোটোকল এর নাম, যা ডেটা ইন্টারনেটে সুরক্ষিতভাবে সরবরাহ করার জন্য ব্যবহৃত হয়।TLS হলো SSL প্রোটোকলের পুনঃনির্মিত সংস্করণ এবং এটি সবচেয়ে আধুনিক ইনক্রিপশন প্রোটোকল।

HTTPS এ আমাদের পুরাতন HTTP কানেকশনই থাকে, কিন্তু এই ক্ষেত্রে রিকোয়েস্ট রেসপন্স কে TSL এর প্রভাইড করা শক্তিশালী ইনক্রিপ্টেড কানেকশন দ্বারা আবদ্ধ করা হয়।

SSL & TLS

আমাদের ডেটা ইনক্রিপ্টেড রাখার জন্য আমাদের SSL/TLS সার্টিফিকেট দরকার হয়। এটি অনেকটা ডিজিটাল সার্টিফিকেট এর মতন, যা মূলত সার্ভারের ওনারশিপ ভেরিফাই করার জন্য ব্যবহার হয়। এটি একটি সাইন সার্টিফিকেট, তারমানে কোনো বিশ্বস্ত অর্গানাইজেশন দ্বারা এই সার্টিফিকেট ভ্যারিফাইট হতে হয়। যেমনটা আমরা আমাদের ব্যক্তিগত বা পেশগত জীবনে আমাদের বিভিন্ন ডিগ্রি ভ্যারিফায়ের জন্য আমাদের স্কুল, কলেজ বা বিশ্ববিদ্যালয় থেকে প্রাপ্ত সার্টফিকেট দিয়ে প্রমান করে থাকি।

সুতরাং SSL/TLS এর ক্ষেত্রে আমাদের এমন কোনো অর্গানাইজেশন দ্বারা সার্টিফিকেট ভ্যরিফাই হতে হবে যাকে আমাদের কম্পিউটার বা ব্রাউজার বিশ্বাস করবে। Let's Encrypt হল এমন একটি অর্গানাইজেশন যারা TLS সার্টফিকেট প্রদান করে থাকে। এটি গুগল, ফেসবুক এর মতন বড় বড় কম্পানি দ্বারা সমর্থিত। Let's Encrypt তাদের কিছু নিজস্ব কন্ডিশন পূরণ করার মাধ্যমে আমাদের সার্টফিকেট প্রদান করে থাকে, যেমন - আমাদের ওয়েবসাইটের একটি ডোমেন নাম থাকতে হবে এবং এটি পাবলিকলি অ্যাক্সেক করা যাবে ইত্যাদি।

কিন্তু আমাদের ওয়েব অ্যাপ্লিকেশন যখন লোকাল মেশিনে ডেভেলপ বা টেস্টিং এর জন্য রাখব তখন ত আমাদের Let's Encrypt এর কন্ডিশন পূরণ করা সম্ভব না। তাহলে কি আমরা আমাদের লোকাল মেশিনে HTTPS ব্যবহার করতে পারব না? অবশ্যই পারব, এর জন্য আছে Self-Signed Certificare।মাঝে মধ্যে কিছু ওয়েবসাইট ভিজিট করার সময় আমরা নিচের মত ওয়ার্নিং দেখতে পাই -

এই সকল সাইটে Self-Signed Certificare ব্যবহার করা হয়েছে। এই ক্ষেত্রে HTTPS ব্যবহার করতে পারলেও সেটি সিকিওর না কারণ, এটি কোনো সার্টিফিকেট অথরিটি দ্বারা ভ্যারিফাই করা নয়। এটি প্রডাকশনে ব্যবহারের জন্য মোটেও সিকিওর না, লোকাল ডেভেলপমেন্টের জন্য এটি ব্যবহার করা যায়।

Create an HTTPS server in Node.js

আমরা OpenSSL এর মাধ্যমে Self-Signed Certificare তৈরি করতে পারি। বিভিন্ন লিনাক্স ডিস্ট্রিবিউশনসমূহে এবং ম্যাকওএস এ OpenSSL ইনস্টল অবস্থায় থাকে, আর উইন্ডোজের ক্ষেত্রে আমারা যদি Git ইনস্টল করি তাহলেই হবে।

আমাদের টার্মিনালে, উইন্ডোজের ক্ষেত্রে Gitbash এ নিচের কমান্ডটা রান করলে key.pem এবং cert.pem নামে দুইটা ফাইল তৈরি হবে।

openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365

এখানে, key.pem এ private key স্টোর করা থাকে। যার দ্বারা authentication এবং encryption এর কাজ করা হয়। যখন ক্লায়েন্ট (ওয়েব ব্রাউজার) কোনো সার্ভারের সাথে সংযোগ স্থাপন করে, তখন সার্ভারটি তার SSL/TLS সার্টফিকেট উপস্থাপন করে। ক্লায়েন্ট সার্টিফিকেটের (cert.pem) ভেতর থাকা public key ব্যবহার করে তথ্য এনক্রিপ্ট করে যা শুধুমাত্র সার্ভারের private key দিয়েই ডিক্রিপ্ট করা যায়। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের গোপনীয়তা এবং অখণ্ডতা নিশ্চিত করে।

import express from 'express';
import fs from 'fs';
import https from 'https';

const app = express();

app.use(express.json());

app.get('/secure', (req, res) => {
  return res.status(200).json('Application is using https');
});

https
  .createServer(
    {
      key: fs.readFileSync('key.pem'),
      cert: fs.readFileSync('cert.pem'),
    },
    app
  )
  .listen(3000, () => {
    console.log('Server running on port 3000');
  });

উপরের কোডটি TypeScript আর Express এর সমন্বয়ে তৈরে একটা Node অ্যাপ্লিকেশনের। এখানে Node.js এর https মডিউল ইম্পর্ট করে নেওয়া হয়েছে। সার্ভার তৈরি করার জন্য https.createServer ফাংশন কল করা হয়েছে। এই ফাংশনে দুইটা প্যারামিটার পাস করা হয়েছে, প্রথমে একটা অবজেক্ট যার ভেতর key এবং cert প্রপার্টির ভেতর যথাক্রমে আমাদের জেনারেট করা key.pem ও cert.pem ফাইল Node এর fs মডিওল এর মধ্যমে রিড করা হয়েছে এবং সর্বশেষ প্যারামিটার হল আমাদের express() অ্যাপ।