پَم لطفا با هر پسورد عکس بگیر..!

سلام تا حالا شده بری پا سیستمت و حس کنی کسی شیطنت کرده و اومده پای سیستمت؟ خیلی سخت نگیر چون بیشتر وقت ها توهمی بیش نیست ! هدف منم این نیست مچ گیری کنم.. ولی یه بار برام جالب شد که چطور میشه هر وقت کسی پسورد منو زد یه عکس ازش داشته باشم .. بعد از اینکه این کار رو انجام دادم و چند تا عکس از خودم رو دیدم فهمیدم که این عکس ها کارکرد بهتری داره .. اونم اینه که گذر زمان رو به من نشون بده... برای همین این دستور رو توی کرانتب هم گذاشتم که علاوه بر موقع پسورد زدن، سیستم خودکار هر یک ساعت ازم عکس بگیره .. گفتم این تجربه رو به اشتراک بزارم تا باهم یه مقدار لینوکس گردی داشته باشیم..اخطار ۱ : روی سیستم شرکت و روی سیستم های حساستون این کار رو امتحان نکنید بخصوص اگه توی لینوکس تازه کارید.. چون جاهای خوبی رو دستکاری نمیکنیم.. اخطار ۲ : اینکه هر بار که سیستم میخواد پسورد بگیره یه عکس هم اولش بگیره طبیعتا باعث میشه به اندازه ی روشن شدن وب کم و عکس گرفتن زمان گرفته بشه مثلا در حد یک ثانیه.. گفتم که اگه از آدم های فوق خفن و سریع مثل هکرهای توی فیلم ها هستید بدانید و آگاه باشید از این مورد !همه چیز زیر سر PAM هست!به هر حال فکر کنم قدم اول اینکه بدونیم روی چی میخوایم کار کنیم و یه تاریخچه ریز از اون رو ببینیم.. ولی اگه کلا با تاریخچه و این چیزا حال نمیکنین مستقیما برید به قسمت شروع به کار..حالا پم ( pam ) چی هست؟پم یک api هست که وظیفه شناسایی یوزر ها به سرویس ها رو داره. قبل از پم برنامه ها مانند لاگین، برای پیدا کردن یوزر نیم ها، فایل /etc/passwd رو چک میکردند و کاربر رو شناسایی میکردند. همه ی برنامه های از این سرویس اشتراکی (shared) استفاده میکردند ولی پیاده سازی جزییات و تنظیم دسترسی ها توی این فایل اشتراکی نبود.بعدا این نیاز حس شد که لازمه برنامه ها از ماژول امنیتی جدا بشند. هسته اصلی همون ماژول باشه و برنامه ها تنظیمات خودشون رو هم داشته باشند. پم باعث یکپارچه شدن مکانیزم شناسایی یوزر با ارائه api سطح بالا و واسط قرار دادن خودش با چندین شِمای سطح پایین شد که به برنامه ها هم اجازه میده که مکانیزم خودشون رو مستقلا پیاده سازی کنند.پم تنظیماتی داره که میتونه برنامه ی خاصی را از دسترسی یوزرها منع کنه یا وقتی برنامه ای تلاش هایی برای اوتنتیکیت انجام میده اخطار بده. ماژول پم موقع اجرای برنامه ها برای انجام کارش به برنامه اضافه میشه.نمایی از لود کردن مازول ها و خواندن تنظیمات توسط پمچهار نوع کلی ماژول برای پم وجود داره که هر ماژولی که نوشته میشه باید حداقل یکی از این موارد رو پیاده سازی کنه: ۱- ماژول شناساگر ( authentication module) : برای شناسایی یوزر و یا ایجاد/ تخریب اعتبارها(credential)۲- ماژول های مدیریت حساب (account management modules) : برای انجام عملیات های مربوط به دسترسی ها و حساب ها، منقضی کردن و محدود کردن اعتبار ها و پسوردها و قوانین ۳- ماژول مدیریت سشن ها ( session management module) : برای راه اندازی و اتمام سشن ها۴- ماژول مدیریت پسورد (password management module) : برای عملیات های مربوط به تغییر و یا آپدیت پسوردهمچنین پم توابع توانمند متفاوتی مهیا میکنه مثل single sign-on authentication, access control و ...لیست مهمترین ماژول های پم:pam_access : delivers log-daemon-style login access control using login/domain names depending on pre-defined rules in /etc/security/access.conf.pam_cracklib : checks the passwords against the password rules.pam_env : sets/unsets environment variables from /etc/security/pam_env_conf.pam_debug : debugs PAM.pam_deny : locks out PAM modules.pam_echo : prints messages.pam_exec : executes an external command.pam_ftp : is the module for anonymous access.pam_localuser : requires the user to be listed in /etc/passwd.pam_unix : provides traditional password authentication from /etc/passwd.تنظیمات پمتنظمات پم رو میشه در /etc/pam.d یا /etc/pam.conf دید$ ls /etc/pam.d/ atd chsh crond fingerprint-auth kde liveinst other password-auth polkit-1 ppp runuser samba sddm-autologin smartcard-auth sssd-shadowutils sudo su-l systemd-user vmtoolsd chfn config-util cups kcheckpass kscreensaver login passwd pluto postlogin remote runuser-l sddm sddm-greeter sshd su sudo-i system-auth vlock xserverهر برنامه ای که بخواد برای پم خودش تنظیماتی داشته باشه اینجا قرارش میده و اگه برای برنامه ای تنظیمات صریحی اینجا وجود نداشته باشه فایل other به عنوان تنظیماتش استفاده میشه.برای اینکه درکی از ساختار تنظیمات پم داشته باشیم یه سری از فیلد هایی که استفاده میشه رو اینجا توضیح میدم:نام برنامه یا سرویس (Service_name)نوع ماژول (Module_type) : مشخص کننده ی نوع ماژول است (auth, account, session, and passwd )فلگ وضعیت (Control_flag) : مشخص کننده ی وضعیت کنترل است که آیا این فیلد الزامی ، کافی و یا اختیاری است ( requisite, required, sufficient, and optional)آدرس ماژول (Module_path) : آدرس ماژول ( پیشفرض:/lib/security )فیلدها/ آرگومان های اختیاری (Module_options/module_args) : آپشن ها و آرگومان های ورودی لازم برای پاس دادن به ماژولفلگ وضعیت گزینه ی مهم و حساسی هست که باید توضیح داده بشه.. فرض کنین این چند خط مربوط به یک ماژول مثلا ماژول A باشه:خب نکته مهم اینه که این زنجیره به ترتیب خونده میشه یعنی برای اوتنتیکیت اول گفته pam_env الزامی هست.. یعنی میره اون رو اجرا میکنه و اگه جواب منفی بده ماژول A جواب منفی برمیگردونه در غیر این صورت میره سراغ خط بعد که pam_fprintd.so هست و جواب این کافیه .. یعنی اگه این بگه اوکیه ماژول A اوکی برمیگردونه و اگه بگه اوکی نیست میره سراغ خط بعد که گفته هرکی اومد تا اینجا اوکی نگرفته رو جواب منفی بده .. البته هیچ کدوم از این موارد پارامتر اختیاری نداشتند برای همین یه مثالی که پارامتر داشته باشه هم اوردم که نیازی به توضیح نداره و مشخصه:account sufficient pam_succeed_if.so uid < 1000 quietاین رو هم اضافه کنم که برای فلگ های کنترل حالت های requisite و include و substack هم وجود داره که گوگل (که رضوان خدا بر او باد) میتونه جوابتون رو بده اما اگه خواستید فلگ ترکیبی و پیچیده ای بنویسید این مورد رو توی ذهنتون داشته باشید. [value1=action1 value2=action2 ...]مثال :auth [default=1 ignore=ignore success=ok] pam_localuser.soشروع کار، نوشتن دستور عکس گرفتناول ایده کار چیه ؟ با توجه به مواردی که گفته شد میتونیم دستوری رو خارج از پم اجرا کنیم.. پس یه بش کوچیک مینویسیم که هر وقت صدا زده شد یه عکس بگیره و با یه فرمت خاص جای خاصی ذخیره کنه که من قبلا اون رو نوشتم و توی مسیر /usr/local/bin/grabpicture قرار دادم.# cat /usr/local/bin/grabpicture#!/bin/bashts=`date +%s`ffmpeg -f v4l2 -s 640x480 -i /dev/video0 -vframes 1 /home/user/Pictures/webcamphotos/vid-$ts.%01d.jpgexit 0 این دستور میاد با ffmpeg یک فریم تصویر با کیفیت ۴۸۰×۶۴۰ از دیوایس /dev/video0 میگیره و توی فایلی در دایرکتوری مشخص شده عکس رو ذخیره میکنه و برای اینکه عکس ها روی هم ریخته نشند به آخر اسم هر عکس زمان رو اضافه میکنه.یادتون باشه هم آدرس محل ذخیره رو تنظیم کنین و هم قابلیت اجرایی بهش بدین :# chmod a+x /usr/local/bin/grabpictureیک بار دستور رو اجرا کنین ببینید درست کار میکنه یا نه .. اگر ارور داد که ffmpeg نصب نیست دست نیاز به درگاه گوگل دراز کنید و نصبش کنید! (دنبال نصب libav-tools باشید)تغییر در کانفیگ PAMحالا بریم سراغ اینکه پم رو تنظیم کنیم تاهر وقت پسورد زده شد یه عکس از محضر مبارک فردی که جلوی وب کم هست بگیره..ابتدا عرض کنم که به جای دستکاری مستقیم این فایل ها راه دیگه ای با استفاده از authselect هم وجود داره که ازش استفاده نکردم و برای جلوگیری از اینکه اگه احیانا در طول کار به مشکلی بخورید توی ترمینال دسترسی روت رو بگیرید.حالا به اول هر دو فایل /etc/pam.d/password-auth و /etc/pam.d/system-auth مورد زیر رو اضافه می کنیم تا هر وقت ماژول های مربوط به سیستم و مربوط به پسورد خواستند عمل کنند عکس گرفته بشه :auth [default=ignore] pam_exec.so seteuid /usr/local/bin/grabpictureعلت اینکه دیفالت(پیشفرض) رو گفتم ایگنور(نادیده) در نظر بگیره اینه که ممکنه یه سری داستان پیش بیاد و برنامه خروجی صفر نداشته باشه( برنامه با موفقیت تموم نشه)... اونوقت سیستم گیر نکنه.. مثلا فرض کنین وسط ویدئو کال میخواید پسورد بزنین.. قاعدتا وب کم درگیره و نمیشه ازش استفاده کنین .. اگه نگیم نتیجه دستور رو نادیده بگیر .. اونوقت مجبوریم وسط ویدئو کال ویدئو رو قطع کنیم تا پسورد بتونه چک بشه و بعد برگردیم به ویدئو کال.. یا اگه هارد پر شده باشه وقتی میخواد پسورد رو چک کنه ارور میده که جا ندارم و در نتیجه همیشه میگه پسورد اشتباهه!حالا ترمینال جدید باز کنین و سعی کنین یه دستور با sudo اجرا کنین .. اگه تصویر ازتون گرفته شد و پسورد اعتبار سنجی ش هم درست کار کرد یعنی همه چیز درسته و کار تمامه.. اگر هم نشد که باید دید داستان چیه.. (اون ترمینال روت شده اینجا به کار میاد .. برای غیرفعال کردن تنظیمات حداقل کار لازم اینه که ابتدای خطی که به هردوفایل اضافه کردیم # اضافه کنین تا کامنت بشند یا اون خط رو حذف کنین و فایل ها رو ذخیره کنین..)گذر زمانتا اینجا تونستیم به پم بگیم که هر وقت پسورد رو خواست بگیره یه عکس هم بگیره... حالا اگه دوست دارین مجموعه از تصاویر خودتون حین کار کردن با سیستم رو داشته باشید کافیه یه کران ست کنین تا مثلا هر ساعت ازتون عکس بگیره.. دستور زیر رو بزنین و داخلش عبارت بعدی رو تایپ کنین و ذخیره کنین: $ sudo crontab -e0 * * * * /usr/bin/sh /usr/local/bin/grabpictureیا@hourly /usr/bin/sh /usr/local/bin/grabpictureاز این تصاویر میتونید با دستور زیر یه فیلم کوتاه از لحظات زدن پسورد یا کار با سیستم داشته باشید.$ cat ./home/user/Pictures/webcamphotos/video.sh#!/bin/bashts=`date +%s`ls -tr|cat *.jpg | ffmpeg -f image2pipe -r 5 -vcodec mjpeg -i - -vcodec libx264 out-video-$ts.mp4برای ساخت یه قاب عکس از تصاویرتون هم با کامند زیر یه تصویر بزرگ از تصاویر گرفته شده ساخته میشه:$ cat ./home/user/Pictures/webcamphotos/squareFrame.sh#!/bin/bashts=`date +%s`number=$(ls *.jpg |wc -l | awk '{printf "%.f",sqrt($1)}')ffmpeg -pattern_type glob -i "*.jpg" -filter_complex scale=80:-1,tile="$number"x"$number":margin=10:padding=4 output-squareFrame-$ts.png( این توضیح رو اضافه کنم که برای ایجاد قاب n*n که برابر بیشترین تعداد عکس از m تا عکس رو بشه توش جات داد نیاز داریم بدونم نزدیک ترین ریشه برای اینکار مقدارش چقدره و اون خطی که number حساب شده هم برای همینه و صد البته می تونین کل داستان رو بهتر کنین )این عکسی که اینجا گذاشتم نتیجه ی این کار روی سیستم خودم بوده و چیزی حدود ۴۰۰۰ تا عکس از من توی این عکس هست که البته بنا بر صلاحدید خودم کیفیت رو داغون کردم :)یک قاب عکس از من در پشت سیستم با بیش از ۴۰۰۰ عکس :)کارهای جالبتری هم میشه کرد.. از اینکه ورود دومرحله راه بندازید یا عکس رو بفرستید توی صف و هر وقت اینترنت بود بفرستیدش به تلگرامتون.. یا برای تایید تشخیص چهره انجام بدین و یا هر شیطونی دیگه ای.. امیدوارم بهتون خوش گذشته باشه.. خوشحال میشم که نظرات انتقادات و پیشنهاداتتون رو برام بنویسید..خوش باشید..لینک ها : لینک و لینک پ.ن: بماند به یادگار.. منتشر شد بدون تغییر پس از یکسال در پیش‌نویس بودن..