gpgwrap(1) General Commands Manual gpgwrap(1)

gpgwrap - پوشش‌دهنده‌ای کوچک برای gpg

gpgwrap -V

gpgwrap -P [-v] [-i] [-a] [-p <file>]

gpgwrap -F [-v] [-i] [-a] [-c] [-p <file>] [-o <name>] [--] <file> [<file> ... ]

gpgwrap [-v] [-i] [-a] [-p <file>] [-o <name>] [--] gpg [gpg options]

ابزار GNU Privacy Guard (gpg) گزینهٔ --passphrase-fd را ارائه می‌دهد. این گزینه به gpg دستور می‌دهد تا عبارت عبور را از توصیف‌گر فایل (file descriptor) داده‌شده بخواند. معمولاً این توصیف‌گر فایل پیش از اجرای gpg از طریق execvp(3) باز می‌شود. این دقیقاً همان کاری است که gpgwrap انجام می‌دهد. عبارت عبور را می‌توان به ۴ روش به gpgwrap انتقال داد:

  • به‌عنوان مسیر فایل، که در آن عبارت عبور به‌صورت متن ساده در فایل ذخیره شده است
  • از طریق پایپ شدن از برنامه‌ای دیگر به ورودی استاندارد (stdin) ابزار gpgwrap
  • از طریق متغیر محیطی GPGWRAP_PASSPHRASE
  • با اعلان (prompt) ابزار gpgwrap برای دریافت آن

بدون رعایت اقدامات احتیاطی، مورد اول زیرساخت امنیتی ارائه‌شده توسط gpg را تضعیف می‌کند. اما در محیط‌های کاملاً دسته‌ای (batch-oriented)، ممکن است این دقیقاً همان چیزی باشد که نیاز دارید. در غیر این صورت، اگر مایلید عبارت‌های عبور را یک بار وارد کرده و نمی‌خواهید آن‌ها به‌صورت متن ساده درون یک فایل ذخیره شوند، ابزار gpg-agent همان چیزی است که به دنبال آن هستید. یکی دیگر از اشکالات امنیتی می‌تواند استفاده از متغیر محیطی GPGWRAP_PASSPHRASE باشد که حاوی عبارت عبور است و ممکن است توسط سایر فرایندهای همان کاربر خوانده شود.

چاپ نگارش و خروج.
دریافت عبارت عبور و چاپ دستکاری‌شدهٔ (mangled) آن در stdout.
خواندن دستورهای gpg از فایل‌های داده‌شده. اگر <file> برابر - باشد، از stdin خوانده می‌شود. دقیقاً انتظار یک دستور در هر خط وجود دارد. با خط داده‌شده به روش زیر رفتار می‌شود:
  • در مرحلهٔ نخست، عبارت عبور دستکاری می‌شود؛ بدین معنی که نویسه‌های نامتعارف با اعداد هشت‌هشتیِ (octal) فرار داده‌شده با بک‌اسلش جایگزین می‌شوند.
  • در مرحلهٔ دوم، عبارت عبور دستکاری‌شده در متغیر محیطی GPGWRAP_PASSPHRASE ذخیره می‌شود.
  • عبارت "exec gpgwrap -- " به ابتدای هر خط افزوده می‌شود، پیش از آن‌که نتیجه به‌عنوان آرگومان به "sh -c" داده شود.
چاپ اطلاعات نحوه استفاده.
افزایش سطح جزئیات خروجی (پُرگویی).
همیشه برای دریافت عبارت عبور اعلان می‌دهد (گزینهٔ -p و متغیر محیطی را نادیده می‌گیرد).
هنگام اعلان برای عبارت عبور، دو بار پرسیده شود.
هنگام خواندن دستورهای gpg از یک فایل، gpgwrap به‌طور پیش‌فرض وضعیت خروج فرایندهای فرزند خود را نادیده می‌گیرد. این گزینه بررسی وضعیت خروج را فعال می‌کند. اگر یک فرزند به‌طور غیرعادی یا با وضعیتی غیر از ۰ خاتمه یابد، gpgwrap بلافاصله متوقف شده و با همان وضعیت خروج بازمی‌گردد. همچنین بخش گزارش باگ‌ها (BUGS) را ببینید.
خواندن عبارت عبور از <file>. اگر <file> برابر - باشد، از stdin خوانده می‌شود. انتظار می‌رود عبارت عبور به‌صورت متن ساده باشد. اگر این گزینه مشخص نشده باشد، عبارت عبور یا از متغیر محیطی GPGWRAP_PASSPHRASE خوانده می‌شود یا در صورت تنظیم نبودن این متغیر محیطی، روی tty کنترل‌کننده اعلان داده خواهد شد.
مشخص کردن نام گزینهٔ "--passphrase-fd" قابل فهم برای برنامه‌ای که قرار است اجرا شود. این قابلیت زمانی مفید است که می‌خواهید از gpgwrap در ترکیب با برنامه‌هایی غیر از gpg استفاده کنید.

عبارت عبور داده‌شده بسته به روشی که به gpgwrap ارسال شده است، مشمول چند محدودیت می‌شود:

  • محدودیت اندازه وجود دارد: عبارت عبور نباید بزرگ‌تر از چند کیلوبایت باشد (برای اطلاع از اندازهٔ دقیق، کد منبع را بررسی کنید).
  • ابزار gpgwrap به شما امکان می‌دهد از تمام نویسه‌ها حتی \000 در عبارت عبور استفاده کنید، اما این بدان معنا نیست که gpg آن را خواهد پذیرفت. اگر عبارت عبور شامل نویسه‌هایی مانند \012 (که در C با نام \n نیز شناخته می‌شود) باشد، ممکن است gpg آن را رد کند یا تنها بخشی از آن را بخواند.
  • اگر متغیر محیطی GPGWRAP_PASSPHRASE را تنظیم می‌کنید، باید در مورد نویسهٔ بک‌اسلش دقت ویژه‌ای داشته باشید، زیرا gpgwrap از بک‌اسلش برای فرار (escape) دادن اعداد هشت‌هشتی استفاده می‌کند (گزینهٔ -F را ببینید). بنابراین، خود بک‌اسلش را به‌صورت عدد هشت‌هشتی بنویسید: \134.

1.
gpgwrap -p /path/to/a/secret/file  \
gpg -c -z 0 --batch --no-tty  \
    --cipher-algo blowfish < infile > outfile
خواندن عبارت عبور از /path/to/a/secret/file و اجرای gpg برای انجام رمزگذاری متقارن روی infile و نوشتن آن در outfile.
2.
gpgwrap -i -a  \
gpg -c -z 0 --batch --no-tty  \
    --cipher-algo blowfish < infile > outfile
همانند بالا، با این تفاوت که gpgwrap دو بار برای دریافت عبارت عبور اعلان می‌دهد.
3.
gpgwrap -F -i - <<EOL
gpg --decrypt --batch --no-tty < "$HOME/infile1" > "$HOME/outfile1"
gpg --decrypt --batch --no-tty < "$HOME/infile2" > "$HOME/outfile2"
gpg --decrypt --batch --no-tty < "$HOME/infile3" > "$HOME/outfile3"
gpg --decrypt --batch --no-tty < "$HOME/infile4" > "$HOME/outfile4"
EOL
ابزار gpgwrap برای دریافت عبارت عبور اعلان می‌دهد و چهار نمونه از gpg را برای رمزگشایی فایل‌های داده‌شده اجرا می‌کند.
4.
GPGWRAP_PASSPHRASE="mysecretpassphrase"
export GPGWRAP_PASSPHRASE
gpgwrap -F -c -v /tmp/cmdfile1 - /tmp/cmdfile2 <<EOL
gpg --decrypt --batch --no-tty < "$HOME/infile1" > "$HOME/outfile1"
gpg --decrypt --batch --no-tty < "$HOME/infile2" > "$HOME/outfile2"
gpg --decrypt --batch --no-tty < "$HOME/infile3" > "$HOME/outfile3"
gpg --decrypt --batch --no-tty < "$HOME/infile4" > "$HOME/outfile4"
EOL
همانند بالا، با این تفاوت که gpgwrap عبارت عبور را از طریق متغیر محیطی دریافت می‌کند، دستورها را علاوه بر آن از فایل‌های دیگر نیز می‌خواند و وضعیت خروج هر نمونه از gpg را بررسی می‌کند. بدین معنا که اگر یک دستور gpg وضعیت خروجی غیر از صفر داشته باشد، هیچ دستور دیگری اجرا نخواهد شد. افزون بر این، gpgwrap خروجی پرجزئیات (verbose) تولید می‌کند.
5.
GPGWRAP_PASSPHRASE="$(gpgwrap -P -i -a)"
export GPGWRAP_PASSPHRASE
find . -maxdepth 1 -type f |
while read FILE; do
    FILE2="$FILE.bz2.gpg"
    bzip2 -c "$FILE" |
    gpgwrap gpg -c -z 0 --batch --no-tty  \
        --cipher-algo blowfish > "$FILE2" &&
    touch -r "$FILE" "$FILE2" &&
    rm -f "$FILE"
done
خواندن عبارت عبور، فشرده‌سازی تمام فایل‌های دایرکتوری جاری، رمزگذاری آن‌ها و حفظ تاریخ فایل اصلی.
6.
find . -maxdepth 1 -type f -name '*.bz2.gpg' |
awk '{
    printf("gpg --decrypt --batch --no-tty --quiet ");
    printf("--no-secmem-warning < %s\n", $0);
    }' |
gpgwrap -F -i -c - |
bzip2 -d -c - |
grep -i 'data'
رمزگشایی تمام فایل‌های *.bz2.gpg در دایرکتوری جاری، خارج کردن آن‌ها از حالت فشرده و چاپ تمام رخدادهای عبارت data. اگر نتیجه را به less پایپ کنید دچار مشکل خواهید شد، زیرا gpgwrap و less هم‌زمان تلاش می‌کنند از TTY بخوانند. در چنین شرایطی بهتر است برای ارائهٔ عبارت عبور از متغیر محیطی استفاده شود (مثال بالا نحوهٔ انجام این کار را نشان می‌دهد).
7.
GPGWRAP_PASSPHRASE="$(gpgwrap -P -i -a)"
export GPGWRAP_PASSPHRASE
gpgwrap -P |
ssh -C -x -P -l user host "
    GPGWRAP_PASSPHRASE=\"\$(cat)\"
    ...
    "
دو بار درخواست برای عبارت عبور و نوشتن آن درون متغیر محیطی GPGWRAP_PASSPHRASE.
8.
echo -n "Passphrase: "
stty -echo
read GPGWRAP_PASSPHRASE
echo
stty echo
export GPGWRAP_PASSPHRASE
روشی دیگر برای اعلان دستی عبارت عبور. این روش در نگارش‌های قدیمی‌تر gpgwrap لازم بود، زیرا آن‌ها از -P پشتیبانی نمی‌کردند. توجه داشته باشید که در این روش، تبدیل خودکار به اعداد هشت‌هشتیِ فرار داده‌شده با بک‌اسلش انجام نمی‌گیرد.
9.
echo "mysecretpassphrase" |
gpg --batch --no-tty --passphrase-fd 0  \
    --output outfile --decrypt infile
روشی ساده برای انتقال عبارت عبور به gpg بدون استفاده از gpgwrap. توجه داشته باشید که نمی‌توانید از stdin برای فرستادن یک فایل به gpg استفاده کنید، زیرا stdin قبلاً برای عبارت عبور مصرف شده است.
10.
gpg --batch --no-tty  \
    --passphrase-fd 3 3< /path/to/a/secret/file  \
    < infile > outfile
این روشی پیشرفته‌تر برای ارسال عبارت عبور است و معادل گزینهٔ -p در gpgwrap می‌باشد. این مثال دست‌کم باید در bash کار کند.
11.
gpg --batch --no-tty --passphrase-fd 3  \
    3< <(echo "mysecretpassphrase")  \
    < infile > outfile
همانند بالا، اما عبارت عبور به‌طور مستقیم داده شده است. این مثال دست‌کم باید در bash کار کند.

در نگارش 0.02 ابزار gpgwrap، وضعیت خروج gpg تنها در صورتی بازگردانده می‌شد که gpgwrap عبارت عبور را از یک فایل خوانده باشد. از نگارش 0.03 به بعد، تنها گزینهٔ -F بررسی وضعیت خروج را به‌طور پیش‌فرض نادیده می‌گیرد، که می‌توان آن را با -c فعال کرد.

gpg, gpg-agent

Karsten Scheibler

gpgwrap 0.04