冰凌互联IT技术论坛

 找回密码
 注册会员

用360账号登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 1384|回复: 1

[教学] Nginx创建密码保护目录

[复制链接]

升级   100%

  • TA的每日心情

    2018-10-6 07:56
  • 签到天数: 673 天

    [LV.9]以坛为家II

    发表于 2016-1-22 19:27:50 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,您在论坛上的提问我们会快速解答。

    您需要 登录 才可以下载或查看,没有帐号?注册会员 用360账号登录  新浪微博登陆

    x

    nginx 的根目录 为:/home/undoner/nginx-www
    nginx 访问地址 为:http://127.0.0.1。对nginx根目录文件访问的权限控制


    (1)nginx指定密码文件格式为:“username:password”,但是password不能为明文,必须经过crypt加密,所以需要用工具产生密码字符串

    以下有三种方法:

    第一种.

    在线直接生成加密字符串:http://tool.oschina.net/htpasswd


    第二种

    python脚本:“htpasswd.py”,也可以下载。


    #!/usr/bin/python"""Replacement for htpasswd"""# Original author: Eli Carterimport osimport sysimport randomfrom optparse import OptionParser# We need a crypt module, but Windows doesn't have one by default.  Try to find# one, and tell the user if we can't.try:    import cryptexcept ImportError:    try:        import fcrypt as crypt    except ImportError:        sys.stderr.write("Cannot find a crypt module.  "                         "Possibly http://carey.geek.nz/code/python-fcrypt/\n")        sys.exit(1)def salt():    """Returns a string of 2 randome letters"""    letters = 'abcdefghijklmnopqrstuvwxyz' \              'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \              '0123456789/.'    return random.choice(letters) + random.choice(letters)class HtpasswdFile:    """A class for manipulating htpasswd files."""    def __init__(self, filename, create=False):        self.entries = []        self.filename = filename        if not create:            if os.path.exists(self.filename):                self.load()            else:                raise Exception("%s does not exist" % self.filename)    def load(self):        """Read the htpasswd file into memory."""        lines = open(self.filename, 'r').readlines()        self.entries = []        for line in lines:            username, pwhash = line.split(':')            entry = [username, pwhash.rstrip()]            self.entries.append(entry)    def save(self):        """Write the htpasswd file to disk"""        open(self.filename, 'w').writelines(["%s:%s\n" % (entry[0], entry[1])                                             for entry in self.entries])    def update(self, username, password):        """Replace the entry for the given user, or add it if new."""        pwhash = crypt.crypt(password, salt())        matching_entries = [entry for entry in self.entries                            if entry[0] == username]        if matching_entries:            matching_entries[0][1] = pwhash        else:            self.entries.append([username, pwhash])    def delete(self, username):        """Remove the entry for the given user."""        self.entries = [entry for entry in self.entries                        if entry[0] != username]def main():    """%prog [-c] -b filename username password    Create or update an htpasswd file"""    # For now, we only care about the use cases that affect tests/functional.py    parser = OptionParser(usage=main.__doc__)    parser.add_option('-b', action='store_true', dest='batch', default=False,        help='Batch mode; password is passed on the command line IN THE CLEAR.'        )    parser.add_option('-c', action='store_true', dest='create', default=False,        help='Create a new htpasswd file, overwriting any existing file.')    parser.add_option('-D', action='store_true', dest='delete_user',        default=False, help='Remove the given user from the password file.')    options, args = parser.parse_args()    def syntax_error(msg):        """Utility function for displaying fatal error messages with usage        help.        """        sys.stderr.write("Syntax error: " + msg)        sys.stderr.write(parser.get_usage())        sys.exit(1)    if not options.batch:        syntax_error("Only batch mode is supported\n")    # Non-option arguments    if len(args) < 2:        syntax_error("Insufficient number of arguments.\n")    filename, username = args[:2]    if options.delete_user:        if len(args) != 2:            syntax_error("Incorrect number of arguments.\n")        password = None    else:        if len(args) != 3:            syntax_error("Incorrect number of arguments.\n")        password = args[2]    passwdfile = HtpasswdFile(filename, create=options.create)    if options.delete_user:        passwdfile.delete(username)    else:        passwdfile.update(username, password)    passwdfile.save()if __name__ == '__main__':    main()

    第三种

    perl脚本:“htpasswd2.pl” ,内容如下:


    #!/usr/bin/perluse strict;my $pw=$ARGV[0];print crypt($pw,$pw)."\n";


    (2)若是第一种方法,直接新建文本复制进去就行;若是第二种或第三种,下载或新建文件后,注意添加可执行权限,再执行脚本生成用户名密码。

    第一种:

    将网页上面的结果(“2eN4uuMHGaLQQ”即“test1”加密后的字符串)直接复制进 htpasswd 文件中

    htpasswd内容:test1:2eN4uuMHGaLQQ

    第二种:


    chmod 777 htpasswd.py./htpasswd.py -c -b htpasswd username password
    比如:./htpasswd.py -c -b htpasswd undoner undoner ,得到文件:htpasswd ,内容如下(“dFYOP1Zvmqyfo”即“undoner”加密后的字符串):

    htpasswd内容:undoner:dFYOP1Zvmqyfo

    第三种:


    chmod 777 htpasswd2.pl./htpasswd2.pl password
    比如:./htpasswd2.pl test ,得到密码字符串:N1tQbOFcM5fpg

    可将 ”N1tQbOFcM5fpg“ 复制进 /etc/nginx/htpasswd 文件中,用户名是明文的,所以设什么都行,格式如下:

    htpasswd内容:test:N1tQbOFcM5fpg


    (3)最后将该密码文件htpasswd复制到nginx的配置文件目录(也可放其他位置,注意改路径+改权限),最后nginx里面添加配置即可。


    chmod 777 htpasswd

    在sites-available/default添加下面两行内容:

    auth_basic "Password";

    auth_basic_user_file /etc/nginx/htpasswd;


    location / {                # First attempt to serve request as file, then                # as directory, then fall back to displaying a 404.                auth_basic "Password";                auth_basic_user_file /etc/nginx/htpasswd;                charset  utf-8;                root    /home/undoner/nginx-www;                index   index.html index.htm;                autoindex on;                # Uncomment to enable naxsi on this location                # include /etc/nginx/naxsi.rules        }

    (4)重启nginx


    sudo /etc/init.d/nginx restart
    回复

    使用道具 举报

    升级   38.2%

  • TA的每日心情
    无聊
    2017-1-12 13:47
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2017-1-11 12:22:33 | 显示全部楼层
    我顶!
    此回复虽仅有两个字,却深刻的表达了回复人的深深的祝福与刻骨的情感,可谓言简意赅,一字千金,字字扣人心弦,催人泪下,足见回复人扎实的文字功底和信手拈来的写作技巧及惨绝人寰的创新能力。实在是佩服佩服!再加上以感叹号收尾,点睛之笔,妙笔生花,意境深远,照应前文,升华主题,把回复人的感情表达得淋漓尽致,给人无限感动和惆怅,有浑然天成之感,实属回复中之极品,祝福中之绝笔...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员 用360账号登录  新浪微博登陆

    本版积分规则

    载入中

    冰凌互联 ( 辽ICP备17007121号 ) 诚信认证   

    GMT+8, 2019-2-17 09:50 , Processed in 0.734085 second(s), 16 queries , Gzip On, Memcache On. 分流加速 On

    阿里云云大使-冰凌网安

    © 2001-2015 冰凌网络信息安全

    快速回复 返回顶部 返回列表