তৈরি ব্যবহারকারী কোনও অনুদান ছাড়াই PostgreSQL এ সমস্ত ডাটাবেস অ্যাক্সেস করতে পারে


44

পোস্টগ্র্রেএসকিউএল সেটআপ করার ক্ষেত্রে অবশ্যই আমি কিছু মিস করছি। আমি যা করতে চাই তা হ'ল একাধিক ডাটাবেস এবং ব্যবহারকারী যা একে অপর থেকে বিচ্ছিন্ন হয়ে থাকে যাতে একটি নির্দিষ্ট ব্যবহারকারীর কেবল আমার নির্দিষ্ট করা ডেটাবেসগুলিতে অ্যাক্সেস থাকে। যাইহোক, আমি যা নির্ধারণ করতে পারি তা থেকে, কোনও তৈরি ব্যবহারকারীর নির্দিষ্ট কোনও অনুদান দেওয়া ছাড়াই সমস্ত ডাটাবেসে অ্যাক্সেস রয়েছে।

আমি এখানে একটি উবুন্টু সার্ভার 12.04 এ যা করছি:

  1. apt-get postgresql ইনস্টল করুন
  2. sudo -u postgres creatuser -DRSP মাইক 1 (নতুন ব্যবহারকারীর জন্য পাসওয়ার্ড নির্দিষ্ট করে)
  3. sudo -u পোস্টের তৈরি করে ডেটা 1
  4. psql -h লোকালহোস্ট -U মাইক 1 ডেটা 1 (লগইন করার জন্য মাইকে 1 ব্যবহারকারীর জন্য পাসওয়ার্ড নির্দিষ্ট করা)

দেখে মনে হচ্ছে যে নতুন ব্যবহারকারী "মাইক 1" এর ডাটাবেস "ডেটা 1" এর সাথে সংযোগ স্থাপন এবং টেবিলগুলি তৈরি করতে কোনও সমস্যা নেই And এবং কোনও গ্রান্ট কমান্ড চালানো ছাড়াই এটি (এবং "ডেটা 1" এর মালিক "পোস্টগ্রিস" কারণ আমি কোনও নির্দিষ্ট করে নি পদক্ষেপ 3 এর মালিক)। এটি কীভাবে কাজ করার কথা?

আমি যা করতে চাই তা হ'ল মাইকে 1 কে ডেটা 1 এ সম্পূর্ণ অ্যাক্সেস প্রদান করা এবং তারপরে এটি আরও ব্যবহারকারী এবং ডাটাবেসগুলির জন্য পুনরাবৃত্তি করুন, এটি নিশ্চিত করে যে ব্যবহারকারীদের কেবলমাত্র আমার পছন্দের একটি (বা সম্ভবত বেশ কয়েকটি) ডাটাবেসে অ্যাক্সেস রয়েছে।


1
মনে রাখবেন যে কোনও ব্যবহারকারী কোনও ডাটাবেসে সীমাবদ্ধ থাকলেও তারা এখনও বিশ্বব্যাপী সারণীগুলি জিজ্ঞাসা করতে পারেন, যা তাদের ডাটাবেসের নামের তালিকা এবং ব্যবহারকারীর তালিকা দেখতে দেয়।
কেজিগ্রিটন

উত্তর:


47

এসকিউএল স্তরে, প্রতিটি ব্যবহারকারী প্রকৃতপক্ষে একটি নতুন তৈরি ডাটাবেসে সংযোগ করতে পারবেন, যতক্ষণ না নিম্নলিখিত এসকিউএল আদেশটি জারি করা হয়:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

একবার হয়ে গেলে, প্রতিটি ব্যবহারকারী বা ভূমিকা যা সংযোগ করতে সক্ষম হতে হবে তা স্পষ্টভাবে সংযোগের সুযোগটি দিতে হবে:

GRANT connect ON DATABASE database_name TO rolename;

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


অন্যদিকে ডিফল্টটি হওয়া উচিত ছিল। আমি এলোমেলোভাবে উত্পন্ন পাসওয়ার্ড সহ একটি ব্যবহারকারী তৈরি করতে চাই এবং postgresসমস্ত ডাটাবেস অ্যাক্সেস করতে পারি তা জেনে এটি একটি একক ডিবিতে অ্যাক্সেস দিতে চাই।
TheRealChx101

24

পাবলিকের ডিফল্টরূপে ডাটাবেসে অ্যাক্সেস রয়েছে তবে এটি ডেটা অ্যাক্সেস করতে পারে না। আপনি পাবলিকটি প্রত্যাহার করতে পারেন:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

আপনি যদি ভবিষ্যতের সমস্ত ডাটাবেসের জন্য এই সেটিংটি চান তবে টেমপ্লেট 1 ডাটাবেসে সংযোগ প্রত্যাহার করুন (একটি নতুন ডাটাবেস তৈরির জন্য ডিফল্ট টেম্পলেট ডাটাবেস):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

আমি দেখি. এখন এটি আরও বোধগম্য হয়। আমার ধারণা পোষ্টগ্র্যাসকিউএল-এ নতুন আগত হওয়া উচিত নয় এবং বিতর্ক করা উচিত যে পাবলিকের ডিফল্ট হিসাবে টেমপ্লেট 1-তে সংযোগ স্থাপন করা উচিত নয় :) তবে আমি এখন আরও দেখি যে ডেটা কখনও বিপদে ছিল না। ধন্যবাদ!
মাইকেপলেট

1
আপনি একজন নবাগত হিসাবে স্বাগত করার চেয়েও সেটিংসের বিরোধিতা করতে পারেন। সবাই তা থেকে শিখতে পারে!
ফ্র্যাঙ্ক হিকেন্স

1
আসলে, যে সংযুক্তি সুবিধাটি টেমপ্লেট থেকে নতুন ডাটাবেসে পাস হয় না তাই টেমপ্লেট 1 এ এটি প্রত্যাহারের উল্লেখ করা প্রভাব নেই।
ড্যানিয়েল ভ্যারিট

2
@ ড্যানিয়েলভিটিé আমি দেখছি। সুতরাং আমি অনুমান করি সমাধানটি সর্বদা মনে রাখা এবং একটি নতুন ডাটাবেস তৈরি করার সময় সংযোগটি প্রত্যাহার করা। পোস্টগ্র্রেএসকিউএল প্রশাসকদের দ্বারা এটি সাধারণত কীভাবে করা হয়, বা ডেটা যেভাবে অ্যাক্সেসযোগ্য নয় সেহেতু আমার এত যত্ন করা উচিত নয়? তবুও, আমি মনে করি যে টেবিলগুলির একটি তালিকা ভবিষ্যতে আক্রমণগুলির জন্য অপ্রয়োজনীয় তথ্য দিতে পারে, যদি কেবলমাত্র বহু-ভাড়াটে পরিবেশে ইতিমধ্যে অনুমোদিত ব্যবহারকারীদের মধ্যে থাকে। এছাড়াও: ঠিক বুঝতে পেরেছি যে জনসাধারণ যে কোনও ডাটাবেসে নিজস্ব টেবিল তৈরি করতে পারে যা সংযোগটি বাতিল হয়নি। একটি ডিফল্ট হিসাবে পেতে নিজেকে কিছুটা অদ্ভুত মনে হয়, আমাকে অবশ্যই বলতে হবে।
মাইকেপলেট

1
হ্যাঁ. আমি আমার উত্তরের সাথে সম্পর্কিত লিঙ্কগুলি যুক্ত করছি, আপনি সে সম্পর্কে আরও কয়েকটি দস্তাবেজ পড়তে চাইতে পারেন।
ড্যানিয়েল ভ্যারিটি

4

ডিফল্টরূপে পাবলিকের কাছ থেকে সংযোগ সুবিধাগুলি প্রত্যাহার করা এবং নির্দিষ্টভাবে পছন্দসই হিসাবে তাদের প্রদানের পাশাপাশি, আপনি যে স্তরটিতে অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন তা অন্য স্তরটি হ'ল pg_hba.conf ফাইলের মাধ্যমে।

ফাইলটি কোথায় সংরক্ষণ করা হয়েছে তা আপনি আবিষ্কার করতে পারেন:

SHOW hba_file;

আপনি যদি এই প্রক্রিয়াটি ব্যবহার করতে চান তবে এম্বেড করা মন্তব্য রয়েছে যা আপনাকে শুরু করার জন্য যথেষ্ট হতে পারে। দস্তাবেজগুলি এখানে রয়েছে:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html


ধন্যবাদ! আমি pg_hba.conf ফাইলটি দেখেছি তবে আমি এই ধারণাটির মধ্যে ছিলাম যে এটি কেবলমাত্র একটি ডাটাবেসে সংযোগ করার সময় কোনও ব্যবহারকারী কীভাবে অনুমোদন দেয় এবং একই ডাটাবেসে ব্যবহারকারী কী কী সুযোগ-সুবিধা দেয় তা নয় তা নিয়ন্ত্রণ করে।
মাইকেপ্লেট

1
কোনও ব্যবহারকারী কেবল pg_hba.conf এর অনুমতি অনুসারে ডাটাবেসে সংযোগ করতে পারবেন । এর মধ্যে কেবল ব্যবহারকারী এবং ডাটাবেসের সংমিশ্রণই নয়, যে হোস্ট থেকে তারা সংযোগ করছেন এবং প্রমাণীকরণের পদ্ধতিটি অনুমোদিত। আপনার যদি সেই নিয়ন্ত্রণের গ্রানুলারিটির প্রয়োজন না হয় তবে অন্যান্য উত্তরে আলোচিত GRANT/ REVOKEকৌশলটি সম্ভবত আরও সহজ। একটি জিনিসের জন্য, আপনার কেবল এটির জন্য একটি সুপারসার ডাটাবেস সংযোগ প্রয়োজন, বনাম কোনও OS লগইন প্রয়োজন যা ফাইল সম্পাদনা করতে পারে।
কেজিগ্রিটন

0

ব্যবহারকারীদের এমনকি অন্যান্য ডাটাবেসের নাম তালিকাবদ্ধ করা থেকে বিরত রাখার জন্য আমি এই থ্রেডটি পেরিয়ে এসেছি। এই REVOKE CONNECTপ্রতিরোধ করে না।

এই এসও প্রশ্নের উত্তর অনুসারে এটি অর্জনের কোনও (প্রস্তাবিত) উপায় নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.