6

यदि मैं कमांड लाइन पैरामीटर के रूप में पासवर्ड का उपयोग करता हूं तो यह ps का उपयोग कर सिस्टम पर सार्वजनिक है।कमांड लाइन पैरामीटर की शैल स्क्रिप्ट पासवर्ड सुरक्षा

लेकिन अगर मैं एक bash खोल स्क्रिप्ट में हूँ और मुझे लगता है जैसे कुछ कार्य करें:

... 
{ somecommand -p mypassword } 
... 

यह अभी भी प्रक्रिया की सूची में दिखाई जा रही है? या यह सुरक्षित है?

  • उप-प्रक्रियाओं के बारे में: (...)? असुरक्षित सही?
  • coprocess?

उत्तर

6

कमांड लाइन हमेशा दिखाई देगी (अगर केवल/proc के माध्यम से)।

तो एकमात्र असली समाधान है: नहीं। आप इसे stdin पर आपूर्ति कर सकते हैं, या एक समर्पित fd:

./my_secured_process some parameters 3<<< "[email protected]" 

(पहले सादगी)

#!/bin/bash 
cat 0<&3 

(इस नमूने सिर्फ stdout करने के लिए एक बुरी पासवर्ड डंप होगा)

की तरह एक स्क्रिप्ट के साथ अब आपको इसके साथ चिंतित होने की आवश्यकता है:

  • एमआईटीएम (धोखाधड़ी वाली स्क्रिप्ट जो पासवर्ड छोड़ती है, उदाहरण के लिए पथ को घटाकर)
  • बैश इतिहास कमांडलाइन में अपना पासवर्ड बनाए रखने (HISTIGNORE बैश के लिए, उदा देखो)
  • स्क्रिप्ट की सुरक्षा पासवर्ड पुनर्निर्देशन tty के लिए प्रयोग किया जाता का
  • सुरक्षा शामिल है कि; कीलॉगर्स; ... के रूप में आप देख सकते हैं, पर हम काम कर 'सामान्य सुरक्षा सिद्धांतों'
+0

लिखने में कोई त्रुटि ऊपर 3 है? क्या यह सिर्फ <<< होना चाहिए? यदि नहीं, तो 3 संकेत क्या है? – q0rban

+0

ठीक है, मुझे लगता है कि मुझे यह मिल गया। यह तर्क की संख्या है? मुझे लगता है कि यह 2 होना चाहिए, हालांकि, 3 नहीं। पहला तर्क 0, दूसरा 1, तीसरा होगा। क्या यह सही है? – q0rban

+1

नहीं। '<<< 'का अर्थ है: इस पाठ को stdin पर स्ट्रीम करें। '3 <<< 'का अर्थ है: इस पाठ को _filedescriptor 3_ पर स्ट्रीम करें। जैसा कि आप डेमो स्क्रिप्ट के साथ देख सकते हैं, फिर आप स्क्रिप्ट से 'fd 3' पढ़ सकते हैं। यह अस्पष्टता से सुरक्षा है क्योंकि stdin/stdout/stderr एकमात्र _ मानक_ (सामान्य) खोल पाइप दायरलेखक हैं। – sehe

0

केवल प्रक्रिया सूची में दिखाया जा रहा से बचने के लिए जिस तरह से उतरा है यदि आप इस कार्यक्रम आप चाहते हैं की पूरी कार्यक्षमता reimplement है शुद्ध बैश कार्यों में कॉल करने के लिए। फंक्शन कॉल अलग प्रक्रिया नहीं हैं। आमतौर पर यह संभव नहीं है, हालांकि।

3

बुलाया कार्यक्रम बस इस तरह argv ओवरराइट करके अपने कमांड लाइन बदल सकते हैं:

#include <stdlib.h> 
#include <string.h> 

int main(int argc, char** argv) { 
    int arglen = argv[argc-1]+strlen(argv[argc-1])+1 - argv[0]; 
    memset(argv[0], arglen, 0); 
    strncpy(argv[0], "secret-program", arglen-1); 
    sleep(100); 
} 

परीक्षण:

$ ./a.out mySuperPassword & 
$ ps -f 
UID  PID PPID C STIME TTY   TIME CMD 
me  20398 18872 0 11:26 pts/3 00:00:00 bash 
me  20633 20398 0 11:34 pts/3 00:00:00 secret-program 
me  20645 20398 0 11:34 pts/3 00:00:00 ps -f 
$ 

युपीडी: मुझे पता है, यह पूरी तरह से सुरक्षित नहीं है और दौड़ की स्थिति पैदा हो सकती है , लेकिन कमांड लाइन से पासवर्ड स्वीकार करने वाले कई प्रोग्राम इस चाल को करते हैं।

3

कैसे एक फ़ाइल वर्णनकर्ता दृष्टिकोण का उपयोग कर के बारे में:

env -i bash --norc # clean up environment 
set +o history 
read -s -p "Enter your password: " passwd 
exec 3<<<"$passwd" 
mycommand <&3 # cat /dev/stdin in mycommand 

देखें:

Hiding secret from command line parameter on Unix

संबंधित मुद्दे