草庐IT

java - 生产JVM的安全调试

coder 2023-08-27 原文

我们有些应用程序有时会进入不良状态,但只能在生产中使用(当然!)。尽管进行堆转储可以帮助收集状态信息,但使用远程调试器通常更容易。设置起来很容易-只需将其添加到他的命令行中:

-Xdebug -Xrunjdwp:transport = dt_socket,server = y,suspend = n,address = PORT

似乎没有可用的安全机制,因此在生产中打开调试将有效地允许任意代码执行(通过hotswap)。

我们混合使用在Solaris 9和Linux(Redhat Enterprise 4)上运行的1.4.2和1.5 Sun JVM。我们如何启用安全调试?还有其他方法可以实现我们的生产服务器检查目标吗?

更新:对于JDK 1.5+ JVM,可以指定调试器应绑定(bind)到的接口(interface)和端口。因此,如果在服务器上正确设置了SSH,KarlP的建议是绑定(bind)回送并仅使用SSH隧道连接到本地开发人员。

但是,似乎JDK1.4x不允许为调试端口指定接口(interface)。因此,我们可以在网络中某个位置阻止对调试端口的访问,也可以在OS本身中进行某些系统特定的阻止(如Jared建议的IPChains等)?

更新#2:这是一种黑客,即使在1.4.2 JVM上,也可以让我们限制风险:

命令行参数:

-Xdebug
-Xrunjdwp:
    transport=dt_socket,
    server=y,
    suspend=n,
    address=9001,
    onthrow=com.whatever.TurnOnDebuggerException,
    launch=nothing

Java代码打开调试器:
try {
    throw new TurnOnDebuggerException();
} catch (TurnOnDebugger td) {
   //Nothing
}

TurnOnDebuggerException可以是保证不会抛出其他任何异常的任何异常。

我在Windows机器上对此进行了测试,以证明(1)调试器端口最初并未接收连接,并且(2)抛出TurnOnDebugger异常(如上所示)使调试器生效。需要启动参数(至少在JDK1.4.2上),但是JVM正常处理了垃圾值。

我们正计划制作一个小型Servlet,该Servlet具有适当的安全性,可以允许我们打开调试器。当然,以后不能将其关闭,并且调试器在打开后仍会混杂地监听。但是,这些是我们愿意接受的限制,因为对生产系统的调试将始终导致事后重启。

更新#3:我最终编写了三个类:(1)TurnOnDebuggerException,一个普通的'ol Java异常,(2)DebuggerPoller,一个后台线程检查文件系统上是否存在指定文件,以及(3)DebuggerMainWrapper,一个启动轮询线程,然后反射地调用另一个指定类的main方法的类。

这是它的用法:
  • 在启动脚本
  • 中用DebuggerMainWrapper替换“主”类
  • 添加两个系统(-D)参数,一个参数指定实际的主类,另一个参数指定文件系统上的文件。
  • 在命令行上使用onthrow = com.whatever.TurnOnDebuggerException部分配置调试器,添加
  • 将具有上述三个类的jar添加到类路径。

  • 现在,当您启动JVM时,除了启动后台轮询器线程外,其他所有内容都相同。假设该文件(我们称为TurnOnDebugger)最初不存在,则轮询器每N秒检查一次。当轮询器第一次注意到它时,它将抛出并立即捕获TurnOnDebuggerException。然后,代理开始。

    您无法将其关闭,并且机器在打开时也不是很安全。从好的方面来说,我认为调试器不允许同时进行多个连接,因此维护调试连接是您的最佳防御方法。我们之所以选择文件通知方法,是因为它允许我们通过在目录中指定触发文件来piggy带我们现有的Unix身份验证/作者,在该目录中,只有适当的使用才有权。您可以轻松构建一个小的 war 文件,该文件通过套接字连接实现相同的目的。当然,由于无法关闭调试器,因此仅在杀死有问题的应用程序之前使用它来收集数据。如果有人需要此代码,请告诉我。但是,您只需花费几分钟即可将其自己放在一起。

    最佳答案

    如果使用SSH,则可以允许建立 channel 并将 channel 建立到本地主机。无需开发,全部使用sshd,ssh和/或腻子完成。

    可以在本地接口(interface)127.0.0.1上设置Java服务器上的调试套接字。

    关于java - 生产JVM的安全调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/922779/

    有关java - 生产JVM的安全调试的更多相关文章

    1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

      我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

    2. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    3. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    4. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

      GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

    5. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

      您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

    6. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    7. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

      使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

    8. ruby - 如何安全地删除文件? - 2

      在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

    9. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    10. ruby-on-rails - 如何调试 cucumber 测试? - 2

      我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

    随机推荐