ব্যবহারকারীরা পড়তে পারে না এমন ফাইলগুলি সন্ধান করবেন?


12

আমি এমন ফাইলগুলি সন্ধান করতে চাই যা কোনও নির্দিষ্ট ব্যবহারকারী পড়তে সক্ষম হবে না।

ধরুন, ব্যবহারকারীর নামটি "ব্যবহারকারী 123" এবং তারা "ইউজার 123" নামে একটি গোষ্ঠীতে রয়েছে। আমি এমন ফাইলগুলি সন্ধান করতে চাইছি যেগুলি যদি তাদের ব্যবহারকারীর মালিকানাধীন হয় তবে আপনার যদি ইউটিআর 12 থাকে; ব্যর্থ হয়েছে যে ফাইলটি যদি গ্রুপ ব্যবহারকারী হয় তবে এটিতে জি + আর চালু থাকতে হবে; ব্যর্থ হওয়ায় এটিতে ও + আর চালু থাকতে পারে।

যেহেতু জিএনইউতে "পাঠযোগ্য" রয়েছে তাই আমি এটি করতে পারি:

sudo -u user123 find /start ! -readable -ls

তবে প্রক্রিয়াটি এমন কোনও ব্যবহারকারী দ্বারা চালিত করতে হবে যার সুডো অ্যাক্সেস নেই। সুতরাং II এটি চেষ্টা করেছে: (এটি o + r পরীক্ষা করে না তবে এটি এই মুহুর্তে গুরুত্বপূর্ণ নয়)

find /start \( -user user123 ! -perm -u=r  \) -o \( -group user123 ! -perm -g=r  \) -ls

তবে এটি এই ফাইলটি তালিকাভুক্ত করে:

272118    4 -rw-------   1 user123   user123       3243 Jul  3 19:50 /start/blah/blah/file.txt

এই ফাইলটি এমন একমাত্র ফাইল যার অধীনে /startব্যবহারকারীর দ্বারা মালিকানাধীন 123 g=rঅফ রয়েছে। এটি যেমন হিসাবে ব্যাখ্যা করা -u=rহয় -g=r

আমি সিদ্ধান্ত নিয়েছিলাম যুক্তিটিকে উল্টো করার চেষ্টা করে পরিবর্তে পরীক্ষার জন্য not ( truth ):

find /etc/puppet ! \( \( -user puppet -perm -u=r  \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \)  -ls

ওই কাজগুলো!

কেন আসল findব্যর্থ? এটি কি কোনও বাগ ইন find(সম্ভাবনা নেই) বা যুক্তিটি ভুল?

আপডেট: আমার যুক্তিটি ভুল ছিল। নীচে হিসাবে নির্দেশিত, যেহেতু! (এ || বি || সি) == (! ও! এন্ড এন্ড বি! এবং সি!) এই দুটি সমতুল্য বক্তব্য:

find /start ! \( \( -user user123 -perm -u=r \) -o \( -group user123 -perm -g=r \) -o \( ! \( -user user123 -o -group user123 \) -perm -o=r \) \) -ls
find /start ! \( -user user123 -perm -u=r \) ! \( -group user123 -perm -g=r \) ! \( ! \( -user user123 -o -group user123 \) -perm -o=r \) -ls

আমার লক্ষ্যটি ছিল না যে দু'বার ব্যবহারকারীর / গ্রুপ পরীক্ষা করা test আমার যা দরকার তা হল আরও জটিল যদি-তবে-অন্য কাঠামো, যা সম্ভবত তখনই সম্ভব হত যদি কোনও এক্স-অপারেটর থাকত। আমি এবং / অথবা / এর বাইরে একটি জোর তৈরি করতে পারি তবে এটি উপরের দুটি সমাধানের চেয়ে জটিল complex


1
এমনকি দ্বিতীয় যুক্তিটিও ভুল, কারণ এটির puppetসাহায্যে কোনও ফাইলের অ্যাক্সেস রয়েছে --wxrwxrwx puppet puppet
স্টাফেন চেজেলাস

উত্তর:


7

যুক্তিটি ভুল। আপনি ভাবছেন এই ফাইলটি তালিকাভুক্ত করা উচিত হয়নি কারণ এটির মালিকানা user123রয়েছে এবং এতে ব্যবহারকারীর rবিট সেট রয়েছে। তবে এটি তালিকাভুক্ত কারণ এটি দ্বিতীয় মানদণ্ডের সাথে মেলে (এটি গ্রুপের মালিকানাধীন user123এবং গ্রুপটির rকিছুটা আনসেট নেই)।

আপনার দ্বিতীয় সংস্করণ ডি মরগানের আইনগুলির একটি কারণেই কাজ করে : একটি গ্রুপের বিবৃতিগুলির যৌক্তিক ORing অবহেলা করা যৌক্তিকভাবে পৃথক বিবৃতিগুলির অবহেলাটিকে অ্যান্ডিংয়ের সমতুল্য। অন্য কথায়:

 ! ( A || B || C ) == ( !A && !B && !C )

কাজ করে findএকটি ফাইল খুঁজছেন যে

  • নয় (ব্যবহারকারীর মালিকানাধীন user123এবং উক্ত ব্যবহারকারী দ্বারা পাঠযোগ্য) এবং এন্ড
  • (গোষ্ঠীর মালিকানাধীন user123এবং উক্ত গ্রুপের দ্বারা পঠনযোগ্য) এবং না
  • বিশ্ব পাঠযোগ্য নয়।

যখন প্রথমটি findএকটি ফাইল সন্ধান করছে

  • ব্যবহারকারীর মালিকানাধীন user123এবং ব্যবহারকারী ওআর দ্বারা পাঠযোগ্য নয়
  • গোষ্ঠীর মালিকানাধীন user123এবং উক্ত গ্রুপের ওআর দ্বারা পাঠযোগ্য নয় (যদি আপনি এটি সম্পন্ন করে থাকেন)
  • বিশ্ব পাঠযোগ্য নয়

সুতরাং উপরের 3 টি মানদণ্ডের সাথে মিলে যাওয়া কোনও ফাইল (এবং অগত্যা সবগুলি নয়) আপনার দেখা হিসাবে তালিকাভুক্ত হবে।

সম্পাদন করা

ঘটনাচক্রে (আপনার প্রোফাইল দেখার পরে), আমি আপনার ও'রিলি বইয়ের একটি বড় অনুরাগ :)


বিশ্লেষণের জন্য ধন্যবাদ। হ্যাঁ, এটি মরগানের আইনটির অপব্যবহার ছিল। আমি চেষ্টা করে ( !A && !B && !C )যাচ্ছিলাম তবে আমি !প্রতিটি অংশের অভ্যন্তরটিতে চলে এসেছি , যা বৈধ নয়। ধন্যবাদ!
টমঅনটাইম

পিএস আমি খুশি যে আপনি আমার বইয়ের ভক্ত! আপনি কোন ভাষায় এটি পড়েছেন তা আমি আগ্রহী
টমঅনটাইম

অবশ্যই টমঅনটাইম ইংলিশ অবশ্যই। আমি কোনও বই যদি এর সাহায্য করতে পারি তবে তার মূল ভাষায় পড়ার চেষ্টা করি।
জোসেফ আর।

8

প্রদত্ত পথের মাধ্যমে কোনও ব্যবহারকারীর কোনও ফাইলে অ্যাক্সেস রয়েছে কিনা তা যাচাই করতে আরও অনেকগুলি বিষয় বিবেচনার জন্য রয়েছে:

  • ফাইলের মালিক
  • ফাইল গ্রুপ
  • ফাইলের এসিএল
  • ব্যবহারকারীর uid, gid এবং পরিপূরক গিড
  • এই ফাইলের দিকে পরিচালিত কোনও পাথ উপাদানগুলিতে সন্ধান অ্যাক্সেস।
  • ফাইলটি একটি সিমিলিংক কিনা
  • আইডি 0 ব্যবহারকারীদের জন্য অনুমতিগুলি পৃথকভাবে প্রয়োগ করে।
  • SELinux এর মতো সম্ভবত আরও সুরক্ষা বৈশিষ্ট্য ...

ব্যবহারকারীর মতো সমস্ত ইউড এবং গিডগুলি স্যুইচিংয়ের অভাব এবং পরীক্ষা করে দেখুন, সিস্টেমটি যা করে তার মত একই যুক্তি বাস্তবায়ন করা খুব কঠিন।

Zsh সহ, আপনি (রুট হিসাবে) করতে পারেন:

readable() (
  USERNAME=$u
  [ -r "$REPLY" ]
)
u=some-user
print -rl -- **/*(DoN^+readable)

বা সাথে perl:

find . -print0 | sudo -u some-user perl -Mfiletest=access -l -0ne '
  print unless -r'

এটি উভয় ক্ষেত্রেই ডিরেক্টরি গাছ হিসাবে উত্সাহিত করুন rootতবে সংশ্লিষ্ট ব্যবহারকারী হিসাবে ফাইল অ্যাক্সেসের জন্য পরীক্ষা করুন।

find -readableযেমন চলতে some-userপারে না তেমন কারণ এটি যে ডিরেক্টরিগুলির জন্য ব্যবহারকারীর অ্যাক্সেস বা কোনও পঠন অনুমতি নেই (তবে সম্ভবত অ্যাক্সেস) সেগুলি অতিক্রম করতে সক্ষম হবে না।

এমনকি কেবলমাত্র ফাইলের অনুমতি এবং মালিকানা বিবেচনা করার সময় (এবং এসিএল বা পাথ উপাদানগুলি নয় ...), আপনার কমপক্ষে (এখানে জিএনইউ সিনট্যাক্স) প্রয়োজন:

u=some-user; g=$(id -G "$u" | sed 's/ / -o -group /g'); IFS=" "
find . ! \( -user "$u" -perm -u=r -o \
          ! -user "$u" \( -group $g \) -perm -g=r -o \
          ! -user "$u" ! \( -group $g \) -perm -o=r \)

এই ধারণাটি হ'ল যে যদি ফাইলটি ব্যবহারকারীর মালিকানাধীন থাকে তবে অন্যান্য সমস্ত অনুমতি অপ্রাসঙ্গিক। যদি তা না হয় তবে ফাইলটি যদি ব্যবহারকারীর কোনও গ্রুপেরই মালিকানাধীন থাকে তবে "অন্যান্য" অনুমতি অপ্রাসঙ্গিক।


1
এসিএল এবং অন্যান্য কারণ সম্পর্কে ভাল পয়েন্ট। কেবলমাত্র 100% সঠিক মূল্যায়ন হ'ল access()এটি যেহেতু একই কার্নেল কোডটি ব্যবহার করে open()। একটি বিকল্প sudo -u user123 find /start -readableহলে এইভাবে সেরা সমাধান sudo
টমঅনটাইম

1
@TomOnTime। ভাল না, আপনি যদি sudo -u user123 find -readableএটি ব্যবহার করেন তবে এটি যে ডিরেক্টরিগুলিতে আপনি প্রবেশ করতে পারবেন না সেগুলি বা ডিরেক্টরিতে আপনি পড়তে পারবেন না এমন ফাইলগুলির প্রতিবেদন করবে না (যাতে মিথ্যা নেতিবাচক এবং মিথ্যা ধনাত্মকতা থাকবে)। যে কেন আমি ব্যবহার করার পরামর্শ দিই zshরুট হিসাবে ডিরেক্টরি ট্রি সাজানো এবং না access()( [ -r ... ]) সত্যিকারের ব্যবহারকারী হিসাবে (সেটিং $USERNAMEমধ্যে zshপরিবর্তনগুলি সব uids মত gids sudoহবে)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.