সার্ভার অ্যাপ্লিকেশনের সবচেয়ে গুরুত্বপূর্ণ মেট্রিকগুলির মধ্যে একটি হল নিরাপত্তা। এটি এক ধরনের অ-কার্যকর প্রয়োজনীয়তা । নিরাপত্তা অনেক উপাদান অন্তর্ভুক্ত. অবশ্যই, সমস্ত পরিচিত নিরাপত্তা নীতি এবং নিরাপত্তা ব্যবস্থা সম্পূর্ণরূপে কভার করতে একাধিক নিবন্ধ লাগবে, তাই আমরা সবচেয়ে গুরুত্বপূর্ণ বিষয়ে আলোচনা করব। এই বিষয়ে পারদর্শী একজন ব্যক্তি সমস্ত প্রাসঙ্গিক প্রক্রিয়া সেট আপ করতে পারেন, নতুন সুরক্ষা গর্ত তৈরি করা এড়াতে পারেন এবং যে কোনও দলে প্রয়োজন হবে৷ অবশ্যই, আপনি ভাববেন না যে আপনার আবেদন 100% নিরাপদ হবে যদি আপনি এই অনুশীলনগুলি অনুসরণ করেন। না! তবে এটি অবশ্যই তাদের সাথে আরও সুরক্ষিত হবে। চলো যাই.
1. জাভা ভাষার স্তরে নিরাপত্তা প্রদান করুন
প্রথমত, জাভাতে নিরাপত্তা ভাষার ক্ষমতার স্তর থেকে শুরু হয়। কোন অ্যাক্সেস মডিফায়ার না থাকলে আমরা কী করব? নৈরাজ্য ছাড়া আর কিছুই হবে না। প্রোগ্রামিং ভাষা আমাদের সুরক্ষিত কোড লিখতে সাহায্য করে এবং অনেক অন্তর্নিহিত নিরাপত্তা বৈশিষ্ট্য ব্যবহার করে:- শক্তিশালী টাইপিং। জাভা একটি স্ট্যাটিকালি টাইপ করা ভাষা। এটি রানটাইমে টাইপ-সম্পর্কিত ত্রুটিগুলি ধরা সম্ভব করে তোলে।
- অ্যাক্সেস মডিফায়ার। এগুলি আমাদেরকে প্রয়োজন অনুসারে ক্লাস, পদ্ধতি এবং ক্ষেত্রগুলিতে অ্যাক্সেস কাস্টমাইজ করার অনুমতি দেয়।
- স্বয়ংক্রিয় মেমরি ব্যবস্থাপনা। এর জন্য, জাভা ডেভেলপারদের একটি আবর্জনা সংগ্রহকারী রয়েছে যা আমাদের সবকিছু ম্যানুয়ালি কনফিগার করার থেকে মুক্তি দেয়। হ্যাঁ, মাঝে মাঝে সমস্যা দেখা দেয়।
- বাইটকোড যাচাইকরণ : জাভা বাইটকোডে কম্পাইল করা হয়, যা চালানোর আগে রানটাইম দ্বারা চেক করা হয়।
- নিরাপত্তা-সংবেদনশীল ক্লাস সিরিয়াল করা এড়িয়ে চলুন। সিরিয়ালাইজেশন ক্রমিক ফাইলে ক্লাস ইন্টারফেস প্রকাশ করে, সিরিয়াল করা ডেটা উল্লেখ না করে।
- ডেটার জন্য পরিবর্তনযোগ্য ক্লাস এড়ানোর চেষ্টা করুন। এটি অপরিবর্তনীয় ক্লাসের সমস্ত সুবিধা প্রদান করে (যেমন থ্রেড নিরাপত্তা)। আপনার যদি একটি পরিবর্তনযোগ্য বস্তু থাকে তবে এটি অপ্রত্যাশিত আচরণের দিকে নিয়ে যেতে পারে।
- ফিরে আসা পরিবর্তনযোগ্য বস্তুর কপি তৈরি করুন। যদি একটি পদ্ধতি একটি অভ্যন্তরীণ পরিবর্তনযোগ্য বস্তুর একটি রেফারেন্স প্রদান করে, তাহলে ক্লায়েন্ট কোড বস্তুর অভ্যন্তরীণ অবস্থা পরিবর্তন করতে পারে।
- এবং তাই…
2. এসকিউএল ইনজেকশন দুর্বলতা দূর করুন
এটি একটি বিশেষ ধরনের দুর্বলতা। এটি বিশেষ কারণ এটি সবচেয়ে বিখ্যাত এবং সবচেয়ে সাধারণ দুর্বলতাগুলির মধ্যে একটি। আপনি যদি কম্পিউটারের নিরাপত্তার বিষয়ে কখনোই আগ্রহী না হন, তাহলে আপনি এটি সম্পর্কে জানতে পারবেন না। এসকিউএল ইনজেকশন কি? এটি একটি ডাটাবেস আক্রমণ যেখানে অতিরিক্ত এসকিউএল কোড ইনজেক্ট করা জড়িত যেখানে এটি প্রত্যাশিত নয়। ধরুন আমাদের একটি পদ্ধতি আছে যা ডাটাবেস অনুসন্ধান করার জন্য কিছু ধরণের প্যারামিটার গ্রহণ করে। উদাহরণস্বরূপ, একটি ব্যবহারকারীর নাম। দুর্বল কোড এই মত কিছু দেখতে হবে:
// This method retrieves from the database all users with a certain name
public List findByFirstName(String firstName) throws SQLException {
// Connect to the database
Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);
// Compose a SQL database query with our firstName
String query = "SELECT * FROM USERS WHERE firstName = " + firstName;
// Execute the query
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(query);
// Use mapToUsers to convert the ResultSet into a collection of users.
return mapToUsers(result);
}
private List mapToUsers(ResultSet resultSet) {
// Converts to a collection of users
}
এই উদাহরণে, একটি SQL ক্যোয়ারী একটি পৃথক লাইনে আগাম প্রস্তুত করা হয়। তাই সমস্যা কি, ডান? হয়তো সমস্যা হল String.format ব্যবহার করা ভালো হবে ? না? আচ্ছা, তাহলে কি? আসুন নিজেদেরকে একজন পরীক্ষকের জুতোর মধ্যে রাখি এবং firstName এর মান হিসাবে কী পাস করা যেতে পারে তা নিয়ে ভাবি । উদাহরণ স্বরূপ:
- আমরা যা প্রত্যাশিত তা পাস করতে পারি - একটি ব্যবহারকারীর নাম। তারপর ডাটাবেস সেই নামের সমস্ত ব্যবহারকারীকে ফিরিয়ে দেবে।
- আমরা একটি খালি স্ট্রিং পাস করতে পারেন. তারপর সমস্ত ব্যবহারকারীদের ফিরিয়ে দেওয়া হবে।
- কিন্তু আমরা নিম্নলিখিতগুলিও পাস করতে পারি: "'; ড্রপ টেবিল ব্যবহারকারীরা;"। এবং এখানে আমরা এখন huuuuuuge সমস্যা আছে. এই প্রশ্নটি ডাটাবেস থেকে একটি টেবিল মুছে ফেলবে। সাথে সব ডাটা। এটার সবগুলো.
// This method retrieves from the database all users with a certain name
public List findByFirstName(String firstName) throws SQLException {
// Connect to the database
Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);
// Create a parameterized query.
String query = "SELECT * FROM USERS WHERE firstName = ?";
// Create a prepared statement with the parameterized query
PreparedStatement statement = connection.prepareStatement(query);
// Pass the parameter's value
statement.setString(1, firstName);
// Execute the query
ResultSet result = statement.executeQuery(query);
// Use mapToUsers to convert the ResultSet into a collection of users.
return mapToUsers(result);
}
private List mapToUsers(ResultSet resultSet) {
// Converts to a collection of users
}
এইভাবে দুর্বলতা এড়ানো যায়। যারা এই নিবন্ধের গভীরে যেতে চান তাদের জন্য, এখানে একটি দুর্দান্ত উদাহরণ । আপনি এই দুর্বলতা বুঝতে যখন আপনি কিভাবে জানবেন? আপনি যদি নীচের কমিকটিতে কৌতুকটি পান, তবে সম্ভবত এই দুর্বলতাটি কী তা আপনার কাছে স্পষ্ট ধারণা রয়েছে :D
3. নির্ভরতা স্ক্যান করুন এবং তাদের আপডেট রাখুন
ওটার মানে কি? আপনি একটি নির্ভরতা কি জানেন না, আমি ব্যাখ্যা করব. নির্ভরতা হল কোড সহ একটি JAR সংরক্ষণাগার যা অন্য কারো সমাধান পুনরায় ব্যবহার করার জন্য স্বয়ংক্রিয় বিল্ড সিস্টেম (Maven, Gradle, Ant) ব্যবহার করে একটি প্রকল্পের সাথে সংযুক্ত থাকে। উদাহরণস্বরূপ, প্রজেক্ট লম্বক , যা রানটাইমে আমাদের জন্য গেটার, সেটার ইত্যাদি তৈরি করে। বড় অ্যাপ্লিকেশনগুলিতে প্রচুর এবং প্রচুর নির্ভরতা থাকতে পারে। কিছু ট্রানজিটিভ (অর্থাৎ, প্রতিটি নির্ভরতার নিজস্ব নির্ভরতা থাকতে পারে, এবং তাই)। ফলস্বরূপ, আক্রমণকারীরা ক্রমবর্ধমানভাবে ওপেন-সোর্স নির্ভরতার দিকে মনোযোগ দিচ্ছে, যেহেতু সেগুলি নিয়মিত ব্যবহার করা হয় এবং তাদের কারণে অনেক ক্লায়েন্টের সমস্যা হতে পারে। এটি নিশ্চিত করা গুরুত্বপূর্ণ যে সম্পূর্ণ নির্ভরতা গাছে কোনও পরিচিত দুর্বলতা নেই (হ্যাঁ, এটি একটি গাছের মতো দেখাচ্ছে)। এই কাজ করার বিভিন্ন উপায় আছে।নির্ভরতা পর্যবেক্ষণের জন্য Snyk ব্যবহার করুন
Snyk সমস্ত প্রকল্প নির্ভরতা এবং ফ্ল্যাগ পরিচিত দুর্বলতা পরীক্ষা করে। আপনি Snyk এ নিবন্ধন করতে পারেন এবং GitHub এর মাধ্যমে আপনার প্রকল্পগুলি আমদানি করতে পারেন। এছাড়াও, আপনি উপরের ছবিটি থেকে দেখতে পাচ্ছেন, যদি একটি নতুন সংস্করণে একটি দুর্বলতা সংশোধন করা হয়, তাহলে Snyk সমাধানটি অফার করবে এবং একটি পুল অনুরোধ তৈরি করবে। আপনি ওপেন সোর্স প্রকল্পের জন্য বিনামূল্যে এটি ব্যবহার করতে পারেন। প্রকল্পগুলি নিয়মিত বিরতিতে স্ক্যান করা হয়, যেমন সপ্তাহে একবার, মাসে একবার। আমি Snyk স্ক্যানে আমার সমস্ত পাবলিক রিপোজিটরি নিবন্ধিত এবং যোগ করেছি (এতে বিপজ্জনক কিছু নেই, যেহেতু সেগুলি ইতিমধ্যে সবার কাছে সর্বজনীন)। Snyk তারপরে স্ক্যানের ফলাফল দেখাল: এবং কিছুক্ষণ পরে, Snyk-bot প্রকল্পগুলিতে বেশ কয়েকটি পুল অনুরোধ প্রস্তুত করেছে যেখানে নির্ভরতা আপডেট করা দরকার: এবং এছাড়াও:এটি দুর্বলতা খুঁজে বের করার এবং নতুন সংস্করণগুলির জন্য আপডেটগুলি পর্যবেক্ষণ করার জন্য একটি দুর্দান্ত সরঞ্জাম।গিটহাব সিকিউরিটি ল্যাব ব্যবহার করুন
GitHub এ কাজ করা যে কেউ এর অন্তর্নির্মিত সরঞ্জামগুলির সুবিধা নিতে পারে। আপনি GitHub সিকিউরিটি ল্যাব ঘোষণা করার শিরোনামে তাদের ব্লগ পোস্টে এই পদ্ধতি সম্পর্কে আরও পড়তে পারেন । এই সরঞ্জামটি, অবশ্যই, Snyk এর চেয়ে সহজ, তবে আপনার অবশ্যই এটিকে অবহেলা করা উচিত নয়। আরও কী, পরিচিত দুর্বলতার সংখ্যা কেবল বাড়বে, তাই Snyk এবং GitHub সিকিউরিটি ল্যাব উভয়ই প্রসারিত এবং উন্নতি করতে থাকবে।Sonatype DepShield সক্ষম করুন
আপনি যদি আপনার সংগ্রহস্থলগুলি সংরক্ষণ করতে GitHub ব্যবহার করেন, আপনি আপনার প্রকল্পগুলিতে Sonatype DepShield, MarketPlace-এর একটি অ্যাপ্লিকেশন যোগ করতে পারেন। এটি নির্ভরতার জন্য প্রকল্পগুলি স্ক্যান করতেও ব্যবহার করা যেতে পারে। অধিকন্তু, যদি এটি কিছু খুঁজে পায়, একটি গিটহাব ইস্যু নীচে দেখানো হিসাবে একটি উপযুক্ত বর্ণনা সহ তৈরি করা হবে:4. গোপনীয় তথ্য যত্ন সহকারে পরিচালনা করুন
আমরা বিকল্পভাবে "সংবেদনশীল ডেটা" শব্দগুচ্ছ ব্যবহার করতে পারি। একজন গ্রাহকের ব্যক্তিগত তথ্য, ক্রেডিট কার্ড নম্বর এবং অন্যান্য সংবেদনশীল তথ্য ফাঁস করলে অপূরণীয় ক্ষতি হতে পারে। প্রথমত, আপনার অ্যাপ্লিকেশনটির নকশাটি ঘনিষ্ঠভাবে দেখুন এবং আপনার সত্যিই এই বা সেই ডেটার প্রয়োজন কিনা তা নির্ধারণ করুন। সম্ভবত আপনার আসলে আপনার কাছে থাকা কিছু ডেটার প্রয়োজন নেই — এমন ডেটা যা ভবিষ্যতের জন্য যোগ করা হয়েছিল যা আসেনি এবং আসার সম্ভাবনা নেই। উপরন্তু, আপনি অনেক অজান্তেই লগিং মাধ্যমে এই ধরনের তথ্য ফাঁস. আপনার লগগুলিতে সংবেদনশীল ডেটা প্রবেশ করা থেকে বিরত রাখার একটি সহজ উপায় হল ডোমেন সত্তাগুলির (যেমন ব্যবহারকারী, ছাত্র, শিক্ষক ইত্যাদি) toString() পদ্ধতিগুলি স্ক্রাব করা ৷ এটি আপনাকে দুর্ঘটনাক্রমে গোপনীয় ক্ষেত্রগুলি আউটপুট করা থেকে বাধা দেবে। আপনি যদি toString() তৈরি করতে Lombok ব্যবহার করেনপদ্ধতি, আপনি toString() পদ্ধতির আউটপুটে একটি ক্ষেত্র ব্যবহার করা থেকে বিরত রাখতে @ToString.Exclude টীকা ব্যবহার করতে পারেন। এছাড়াও, বহির্বিশ্বে ডেটা পাঠানোর সময় খুব সতর্কতা অবলম্বন করুন। ধরুন আমাদের একটি এইচটিটিপি এন্ডপয়েন্ট আছে যা সমস্ত ব্যবহারকারীর নাম দেখায়। ব্যবহারকারীর অনন্য অভ্যন্তরীণ আইডি দেখানোর কোন প্রয়োজন নেই। কেন? কারণ একজন আক্রমণকারী ব্যবহারকারী সম্পর্কে অন্যান্য, আরও সংবেদনশীল তথ্য পেতে এটি ব্যবহার করতে পারে। উদাহরণস্বরূপ, আপনি যদি JSON- এ/ থেকে একটি POJO সিরিয়ালাইজ/ডিসিরিয়ালাইজ করতে জ্যাকসন ব্যবহার করেন , তাহলে আপনি @JsonIgnore এবং @JsonIgnoreProperties ব্যবহার করতে পারেননির্দিষ্ট ক্ষেত্রের সিরিয়ালাইজেশন/ডিসারিয়ালাইজেশন প্রতিরোধ করার জন্য টীকা। সাধারণভাবে, আপনাকে বিভিন্ন জায়গায় বিভিন্ন POJO ক্লাস ব্যবহার করতে হবে। ওটার মানে কি?- একটি ডাটাবেসের সাথে কাজ করার সময়, এক ধরনের POJO (একটি সত্তা) ব্যবহার করুন।
- ব্যবসায়িক যুক্তি নিয়ে কাজ করার সময়, একটি সত্তাকে একটি মডেলে রূপান্তর করুন।
- বাইরের বিশ্বের সাথে কাজ করার সময় এবং HTTP অনুরোধ পাঠানোর সময়, বিভিন্ন সত্তা (DTOs) ব্যবহার করুন।
শক্তিশালী এনক্রিপশন এবং হ্যাশিং অ্যালগরিদম ব্যবহার করুন
গ্রাহকদের গোপনীয় তথ্য নিরাপদে সংরক্ষণ করতে হবে। এটি করার জন্য, আমাদের এনক্রিপশন ব্যবহার করতে হবে। কাজের উপর নির্ভর করে, আপনাকে কোন ধরণের এনক্রিপশন ব্যবহার করতে হবে তা নির্ধারণ করতে হবে। উপরন্তু, শক্তিশালী এনক্রিপশন আরও বেশি সময় নেয়, তাই আপনাকে আবার বিবেচনা করতে হবে যে এটির প্রয়োজনীয়তা এটিতে ব্যয় করা সময়কে কতটা ন্যায়সঙ্গত করে। অবশ্যই, আপনি নিজেই একটি এনক্রিপশন অ্যালগরিদম লিখতে পারেন। কিন্তু এটা অপ্রয়োজনীয়। আপনি এই এলাকায় বিদ্যমান সমাধান ব্যবহার করতে পারেন. উদাহরণস্বরূপ, Google Tink :
<!-- https://mvnrepository.com/artifact/com.google.crypto.tink/tink -->
<dependency>
<groupid>com.google.crypto.tink</groupid>
<artifactid>tink</artifactid>
<version>1.3.0</version>
</dependency>
এনক্রিপশন এবং ডিক্রিপশন জড়িত এই উদাহরণটি ব্যবহার করে কি করতে হবে তা দেখা যাক:
private static void encryptDecryptExample() {
AeadConfig.register();
KeysetHandle handle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_CTR_HMAC_SHA256);
String plaintext = "Elvis lives!";
String aad = "Buddy Holly";
Aead aead = handle.getPrimitive(Aead.class);
byte[] encrypted = aead.encrypt(plaintext.getBytes(), aad.getBytes());
String encryptedString = Base64.getEncoder().encodeToString(encrypted);
System.out.println(encryptedString);
byte[] decrypted = aead.decrypt(Base64.getDecoder().decode(encrypted), aad.getBytes());
System.out.println(new String(decrypted));
}
পাসওয়ার্ড এনক্রিপ্ট করা হচ্ছে
এই কাজের জন্য, অসমমিত এনক্রিপশন ব্যবহার করা সবচেয়ে নিরাপদ। কেন? কারণ অ্যাপ্লিকেশনটির আসলে পাসওয়ার্ড ডিক্রিপ্ট করার দরকার নেই। এটি আদর্শ পদ্ধতি। বাস্তবে, যখন একজন ব্যবহারকারী একটি পাসওয়ার্ড প্রবেশ করান, তখন সিস্টেম এটিকে এনক্রিপ্ট করে এবং পাসওয়ার্ড স্টোরে যা আছে তার সাথে তুলনা করে। একই এনক্রিপশন প্রক্রিয়া সঞ্চালিত হয়, তাই আমরা আশা করতে পারি যে তারা মিলবে, যদি সঠিক পাসওয়ার্ড প্রবেশ করানো হয়, অবশ্যই :) BCrypt এবং SCrypt এখানে উপযুক্ত। উভয়ই একমুখী ফাংশন (ক্রিপ্টোগ্রাফিক হ্যাশ) গণনাগতভাবে জটিল অ্যালগরিদম সহ যা অনেক সময় নেয়। এটি আমাদের প্রয়োজন, যেহেতু সরাসরি গণনাগুলি চিরকালের জন্য লাগবে (ভাল, একটি দীর্ঘ, দীর্ঘ সময়)। স্প্রিং সিকিউরিটি অ্যালগরিদমের সম্পূর্ণ পরিসরকে সমর্থন করে। আমরা SCryptPasswordEncoder এবং BCryptPasswordEncoder ব্যবহার করতে পারি. বর্তমানে যা একটি শক্তিশালী এনক্রিপশন অ্যালগরিদম হিসাবে বিবেচিত হয় তা আগামী বছর দুর্বল বলে বিবেচিত হতে পারে। ফলস্বরূপ, আমরা উপসংহারে পৌঁছেছি যে আমরা যে অ্যালগরিদমগুলি ব্যবহার করি সেগুলি নিয়মিত পরীক্ষা করা উচিত এবং প্রয়োজন অনুসারে, এনক্রিপশন অ্যালগরিদম ধারণকারী লাইব্রেরিগুলি আপডেট করা উচিত৷উপসংহারের পরিবর্তে
আজ আমরা নিরাপত্তা নিয়ে কথা বলেছি এবং স্বাভাবিকভাবেই অনেক কিছুই পর্দার আড়ালে রয়ে গেছে। আমি এইমাত্র আপনার জন্য একটি নতুন বিশ্বের দরজা খুলেছি, এমন একটি বিশ্ব যার নিজস্ব জীবন রয়েছে। নিরাপত্তা ঠিক রাজনীতির মতো: আপনি যদি নিজেকে রাজনীতিতে ব্যস্ত না করেন তবে রাজনীতি আপনাকে নিয়েই ব্যস্ত থাকবে। আমি ঐতিহ্যগতভাবে পরামর্শ দিচ্ছি যে আপনি আমাকে GitHub অ্যাকাউন্টে অনুসরণ করুন । সেখানে আমি বিভিন্ন প্রযুক্তির সাথে জড়িত আমার সৃষ্টি পোস্ট করি যা আমি অধ্যয়ন করছি এবং কর্মক্ষেত্রে প্রয়োগ করছি।উপকারী সংজুক
- গুরু99: এসকিউএল ইনজেকশন টিউটোরিয়াল
- ওরাকল: জাভা সিকিউরিটি রিসোর্স সেন্টার
- ওরাকল: জাভা এসই এর জন্য সুরক্ষিত কোডিং নির্দেশিকা
- বেলডং: জাভা নিরাপত্তার মূল বিষয়
- মাঝারি: আপনার জাভা নিরাপত্তা পাওয়ার জন্য 10 টি টিপস
- Snyk: 10 জাভা নিরাপত্তা সর্বোত্তম অনুশীলন
- GitHub: GitHub নিরাপত্তা ল্যাব ঘোষণা করা: বিশ্বের কোড সুরক্ষিত করা, একসাথে
GO TO FULL VERSION