通信人家园
标题:
如何设计一个安全授权系统---之情景对话
[查看完整版帖子]
[打印本页]
时间:
2003-12-30 20:48
作者:
scarlei
标题:
如何设计一个安全授权系统---之情景对话
如何设计一个安全授权系统
之情景对话
(文章纯粹为翻译版本, Copyright 1988, 1997 Massachusetts Institute of Technology.)
人物:
艳芳:积极上进的网络安全工程师
国荣:喜欢鸡蛋里挑骨头
(为了纪念他们,所以选了他们的名字,千万别性格对号啊)
场景一:
在网管工作间中,艳芳和国荣毗邻而坐,各守一台电脑/终端
艳芳:国荣啊,现在这个timesharing系统好烦噢,我都没法工作,总是不停的 有人注册。
国荣:梅姐啊,你别老跟我抱怨。我不也得这么干活儿?
艳芳:我有个想法。我们可以给每个人分配他们自己的终端,这样他们就不用都在一台timesharing上工作。而我们可以把所有的终端都联在一起,他们互相之间可以互相通信。你说怎么样?
国荣:嗯,听上去不错,那我们得买多少个终端,一千多?
艳芳:差不多喽
国荣:那硬盘怎么办?如果每个终端都安装现在timesharing上的软件,哪里有那么大的空间?
艳芳:嘿嘿,这我都想好啦。我们可以把需要的软件分装在几个服务器上。当用户进入他的终端,终端可以去这些服务器上联接需要的程序嘛。也就是这些终端仍旧使用一套软件,这也方便我们软件升级呀。
国荣:听上去不错噢。那你怎么保存用户个人文档?原来的timesharing系统可以让用户注册,然后操作他们的个人文档。那在这个新系统中,你打算把用户的个人文档存在他们的终端?还是每个人拿个软盘,走来走去的?
艳芳:我可以用专门的服务器来保存个人文档呀,就好像每个用户联接程序服务器一样。
国荣:那打印呢?每个终端联一个打印机?还有电子邮件?
艳芳:荣弟呀,我们可以设置打印服务器和邮件服务器呀,这不都一个道理嘛:)
国荣:呵呵,其实这个想法真是不错噢。(坏笑) 等我有了自己的终端,你猜我会干什么?我用你的用户名,假装是你,然后把你的情书都偷看了,然后。。。嘿嘿
艳芳:(神色紧张状) 你不会巴,老弟。
国荣:(得意状) 干吗不?
艳芳:别说,这还真是个事儿。让我好好想想。
国荣:哎,想好了告诉我啊:))
未完,待续
时间:
2003-12-30 21:35
作者:
olleh
未完,等待……
时间:
2003-12-31 17:49
作者:
scarlei
场景二:
地点,国荣办公室;第二天一早,艳芳就敲门了。
艳芳:我想我解决了昨天那个开放系统的安全问题,嘿嘿,象你这样的“奸细“可就没戏啦
国荣:(笑嘻嘻)真的假的呀,坐!
艳芳:(得意状)可得说好了啊,我讲之前要定个规矩。
国荣:说吧,好姐姐。
艳芳:(话入正题)假设我打算从邮件服务器得到我的邮件。事实上,是客户机执行此操作,只不过是在我的指示下。不过在我的叙述中,我还是说我将如何如何。但记住“我“实际上是客户机。明白吗?
国荣:明白。
艳芳:好,那我就开始了啊。在我们描述的开放式系统中,服务器必须能够鉴别用户的身份。 假如我要进入邮件服务器,该服务器必须能够鉴别我是否就是那个真正的用户,不能假冒。对不?
国荣:对。
艳芳:那么我认为这个问题可以通过服务器向客户索要密码来解决。
国荣:恩,可以是可以。可照你这样,岂不是每个服务器都得保存你的密码?如果这个系统有1000个用户,那每个服务器都得保存1000个密码。如果某一用户要更改密码,他就得通知所有的服务器。这样也太。。。
艳芳:没有那么笨啦!是这样子的:不仅每个用户需要密码,每个程序也需要密码。也就是说每个用户得记得自己的密码,每个程序也得记得自己的密码,并且将有一个·授权程序·知道所有的密码,包括用户和程序的。所有的密码都将存在·授权程序·的数据库中。
国荣:(感兴趣状)这个·授权程序·叫什么?
艳芳:哪里顾的上给它起名字了。要不你先给起一个。
国荣:叫它·Charon·吧
艳芳:行。那我继续了啊。
假设你想用邮件服务,那么在这个系统中,除非Charon告诉邮件服务器你的身份是可靠的,你才可以使用服务。于是,你必须先向Charon证明你是合法用户。当你开始向Charon证明自己的身份时,你还要告诉Charon你想用哪个程序。例如,这次你想用邮件服务。
然后Charon要求你输入密码。Charon用你输入的密码和它数据库中你已经注册的那个进行比较。如果相符,那你的身份就通过了。
接着,Charon还得继续向服务器,例如邮件服务器,证明你的身份。因为Charon也知道邮件服务的密码,所以Charon可以把这个密码告诉你。你再带着这个密码去邮件服务器,向它证明你是经过Charon授权的。
可问题是,Charon不应该把邮件服务的密码直接告诉你,因为那样你就知道了,下次,你没准儿就不好好想Charon注册,而直接用这个密码去联系服务器了。你甚至可以假冒别人去用邮件服务,看别人的邮件。
所以,Charon其实并不给你邮件服务的密码,而是给你一张可以用邮件服务的·票·。这张票包含的信息实际上是你的用户名,但经过了邮件服务密码的加密。
(This ticket contains a version of your username that has been ENCRYPTED USING the MAIL SERVER’S PASSWORD.)
你然后就可以拿着这张票去邮件服务器了,并且告诉服务器你的用户名。邮件服务器用它自己的密码去解密你这张票。如果解密成功,那服务器就当然得到了你的用户名。然后它再把解密后得到的用户名和你自己自称的用户名进行比较。如果相符,那你就通过了。
怎么样?
国荣:恩,我有个问题
当这个服务器解密那张票时,它怎么能确定它的解密一定正确呢?我是说,如果因为它解密时发生错误,合法用户也可能被拒绝。那岂不冤枉。
艳芳:恩,这我可不知道
国荣:也许你可以在这张票上再放上这个服务的名字,例如·邮件·。那么当邮件服务器解密这张票时,它可以通过看是否得到了·邮件·这个名字,来验证是否解密正确。
艳芳:(两眼放光状)呵呵,这方法倒不错。那这张票应该是这样的:
TICKET - {username: servicename}
国荣:怎么,票只包括用户名和服务名
艳芳:当然还要用服务密码来加密
国荣:好象还不够哎。
艳芳:怎么?
国荣:假设你向Charon请求一张邮件服务的票。Charon于是把你的用户名·艳芳·放入那张票中。假设当Charon把票传给你时,我得到了这张票,并且拷贝了它。然后我以·艳芳·之名登陆,再用偷来的那张票请求邮件服务。想想看,是不是也能通过?你的邮件仍旧不够安全。
艳芳:是啊,这可不怎么样
国荣:别急啊,梅姐,我还有个法儿来解呢。至少解决部分吧。我认为Charon应该再包括些信息。除了用户名,这张票还应该包括网络地址,也就是用户向Charon申请票时所在的地址。这样你就有了另一层安全保障。
仍旧假设我偷了你的那张票。可是那张票上有了你终端的网址。当我把这张票递给服务器时,服务器经过解密这张票就会发现票上的网址和我的网址不相符。那我不就失败啦,呵呵。
艳芳:8错,8错,俺咋没想出来捏。
国荣:这就是我的作用了吧,嘿嘿
艳芳:那这样,这张票应该是这样了
TICKET – {username: ws_address: servicename}
嘿,这回咱们开始动手弄吧
国荣:别急啊,我还没完呢,呵呵。
现在这个系统听起来好象我每回想用个程序,就得申请一张票。如果我在这里工作一天,假设我想查两次邮件。难道每查一次我就得申请张票?那这有点麻烦了吧。
艳芳:恩,好象票应该可以重复使用吧。假设你得到了这张票,你完全可以重复用它。例如,你可以复制这张票。
国荣:这还差不多。不过还有个问题。如果我还没有这张票,那当我向Charon申请时,我就必须要输入密码。那岂不是说,我用一个程序就得输入一次密码,因为我需要使用这程序的票。例如我今天LOG IN后,第一次用word,输入密码,然后我还想查邮件,又得输入密码,我还想打印,还得输密码。这太麻烦了。
艳芳:是啊,是啊,现在我们的设计是这样。
国荣:还有个更严重的问题。当你向Charon发送你的密码来证明你自己时,你发去的密码是没加密的。那岂不容易被偷。我就能偷,呵呵。
艳芳:我的妈呀,是够严重的。我的脑壳都想疼了,咱们明天再讨论吧。
时间:
2003-12-31 21:02
作者:
scarlei
场景三:
第二天一早,艳芳就在咖啡间找到了国荣
艳芳:嘿,我又给咱那个系统想了个方法。
国荣:噢?这么快(笑嘻嘻)
艳芳:哎,是阿,想了整晚。
国荣:(关心在眼底) 咱们还是去小会议室巴。
艳芳:好,我继续从昨天的问题讲起。不过,这回我将把这些问题转换成系统的安全要求。所以从系统安全要求的观点看:
第一:用户应该只在注册进终端时输入密码,一旦进入将不再有密码提示。
第二:用户密码不应该以不加密的形式放在网上。
国荣:嗯,有意思。
艳芳:从第一个要求看,用户只需要在log in时输入用户密码一次。为此,我将设计一个新的应用程序来解决这个问题。这个程序叫“ticket-granting” ,用来发放我们曾提到的那些“票” 。具体过程应该是用户一旦向Charon证明了自己的身份(通过用户密码) ,Charon将发给用户一张使用“ticket-granting” 的票。於是用户再拿着这张允许使用“ticket-granting” 的票,去“ticket-granting” 申请使用其它应用程序的票。实际上,“ticket-granting” 这个程序还是Charon的一部分,只不过用户改用票,而不用每回输入密码了。
(看国荣迷惑状) 举例来说:你开始注册一台终端,当然你需要向Charon证明你的身份,也就是你要输入密码。然后Charon查明你的身份后,给你一张允许使用“ticket-granting” 的票。这时候,其实你已经注册成功,进入终端。然后,你当然想查一下你的邮件啦,可是这时候你还没有使用邮件系统的票呢,但,你有那张“ticket-granting” 的票。你就用这张票去”ticket-granting” 要一张使用邮件服务系统的票。怎么样?清楚么?所以整个过程你不用第二次输你的用户密码了。
国荣:还是那个问题,我还用每次都申请使用“ticket-granting” 的票么,如果我想使用其它应用程序。
艳芳:不用啦。你还记得,上次我们认为票是可以重复使用的。一旦你得到了这张使用“ticket-granting” 的票,你就可以重复使用它。可以一直用它去申请使用其它应用程序的票。
国荣:唔,这还差不多。而且由於可以重复利用使用应用程序的票,所以一旦“ticket-granting” 给了你,例如一张使用邮件服务的票,你可以用这张票再次使用邮件服务。
艳芳:是,听着还不错吧
国荣:嗯,不过,还有第二个问题呢,你怎么解决用户向Charon发送用户密码的事情?
艳芳:是这样的。当用户向Charon注册要那张ticket-granting的票时,用户不必发送他的密码给Charon,而只发送他的用户名。
国荣:然后。。。
艳芳:然后,Charon用这个用户名到它的数据库中,查相应密码。找到后,Charon就把“ticket-granting” 的票发给用户。注意,Charon在发回这张票时,将用查到的用户密码来加密这张票。
接着,用户收到了这张票后,终端提示用户输入密码。用户输入的密码将用来解密这张票。一旦成功,用户不仅证明了自己身份的合法性,同时也得到了那张票。
国荣:让我想想。不过,你刚才形容的那部分可真不错。可还是有一点挺不安全。就是,我们一直说那些票是可以重复使用的。但其实这是很不安全的。
你想,当你完成操作,准备离开你的终端时(LOG OUT),你很有可能把那些使用应用程序的票留在了那台终端里。
假设,你走后,第二个用户开始使用这台终端。仍旧假设这是个恶意用户,他登陆后发现了这些票。他於是利用这些票去使用应用程序,因为这些票是以你的身份得到的,所以这个恶意用户接近的邮件系统当然是你的邮件, 等等。
更严重的是这个恶意用户保存起这些票,以后可以继续使用。
艳芳:可以这样,我们写个程序。当用户退出登陆时,用程序把这些票删除。
国荣:可以是可以,可如果用户的安全靠这样一个删除程序来保证,还是挺傻的,甚至是不可靠的。例如:
我可以写一个程序来截获并拷贝那些票,当你开始让它们在网上传输时。
然后我等到你退出离开。我更改我的网络地址,假冒成你的那台终端。这样,即使在另一个终端,我仍旧有你的票,你的用户名,和你的网络地址。我仍旧可以进行破坏。即使你在退出前删除了所以票的记录。这样关键问题就显露出来,你的票上没有时间期限。
艳芳:噢,我明白你的意思了。如果票没有时间有效期的限制,那是非常危险的。那我们就给它加个有效期。
国荣:对!我认为每张票都应该再加两个内容:票被创建的时间,和票的有效期。那这张票就应该是这样了:
TICKET {username: address: servicename:lifespan:timestamp}
於是当应用程序解密这张票时,它不仅应该检查用户名,网络地址,还要检查是否这张票已经过期!
艳芳:你说的对!那应该允许这张票的有效期为多久呢?
国荣:我也说不好。按理说应该是用户使用终端的时间。一般8个小时?
艳芳:那要是我工作时间超过了8个小时,我的票可就全过期了,我还得重新再注册?
国荣:那也没什么不合理的呀?
艳芳:好像也是。那我们就定下票的有效期为8个小时。现在我又有个问题了。假设我从网上偷了你的票。。。
国荣:你不会吧?
艳芳:咱这不是假设嘛。假设我有你的票,然后我等着你退出系统。再假设你正好因为有约会而提前退出。怎么办?你的票在我手中仍旧有效,我还是可以干坏事。在这种情况下,票的有效期其实没起多大作用。
国荣:(郁闷状) 是阿,你说的的确有道理。
艳芳:(叹口气) 我看我今晚又睡不好了
通信人家园 (https://www.txrjy.com/)
Powered by C114